|
13.10.1 创建视图
SQL SERVER 提供了使用SQL SERVER Enterprise Manager 和Transac-SQL 命令两种方法来创建视图。在创建或使用视图,时应该注意到以下情况: ? 只能在当前数据库中创建视图,在视图中最多只能引用1024 列; ? 如果视图引用的表被删除,则当使用该视图时将返回一条错误信息,如果创建具有相同的表的结构新表来替代已删除的表视图则可以使用,否则必须重新创建视图; ? 如果视图中某一列是函数、数学表达式、常量或来自多个表的列名相同,则必须为列定义名字; ? 不能在视图上创建索引;不能在规则、缺省、触发器的定义中引用视图; ? 当通过视图查询数据时,SQL SERVER 不仅要检查视图引用的表是否存在,是否有效,而且还要验证对数据的修改是否违反了数据的完整性约束。如果失败将返回错误信息,若正确,则把对视图的查询转换成对引用表的查询。 1、使用SQL SERVER Enterprise Manager 来创建视图 在SQL SERVER 中使用SQL SERVER Enterprise Manager 来创建视图的步骤为: (1) 启动SQL SERVER Enterprise Manager,登录到指定的服务器; (2) 打开要创建视图的数据库文件夹,选中view 图标,此时在右面的窗格中显示当前数据库的所有视图,右击图标,在弹出菜单中选择New View 选项,打开New View 对话框。如图13-1。 在New View 对话框中共有四个区:表区、列区SQL script 区、数据结果区(此时对话框中的四个区都是空白的);
(3) 在创建视图时,首先点击
(4) 在列区中选择将包括在视图的数据列,此时相应的SQL SERVER 脚本便显示在SQL script 区; (5) 单点 (6) 单击 2、Transact-SQL 命令创建视图 使用Transact-SQL 命令CREATE VIEW 创建视图的语法格式为:
各参数的含义说明如下: ? view_name 表示视图名称。 ? select_statement 构成视图文本的主体,利用SELECT 命令从表中或视图中选择列构成新视图的列。 提示:但是在SELECT语句中,不能使用ORDER BY、COMPUTE、COMPUTE BY语句,不能使用INTO关键字,不能使用临时表。 ? WITH CHECK OPTION 保证在对视图执行数据修改后,通过视图能够仍看到这些数据。比如创建视图时定义了条件语句,很明显视图结果集中只包括满足条件的数据行。如果对某一行数据进行修改,导致该行记录不满足这一条件,但由于在创建视图时使用了WITH CHECH OPTION 选项,所以查询视图时,结果集中仍包括该条记录,同时修改无效。 ? ENCRYPTION 表示对视图文本进行加密,这样当查看syscomments 表时,所见的txt 字段值只是一些乱码。 ? SCHEMABINDING 表示在select_statement 语句中如果包含表、视图或引用用户自定义函数,则表名、视图名或函数名前必须有所有者前缀。 ? VIEW_METADATA 表示如果某一查询中引用该视图且要求返回浏览模式的元数据时,那么SQL Server将向DBLIB 和OLE DB APIS 返回视图的元数据信息 例13-13: 使用WITH ENCRYPTION WITH CHECK OPTION 选项,并且包含函数列。
由于使用了WITH CHECK OPTION, 所以当对视图进行修改时,将返回错误信息。比如执行以下语句:
返回错误信息为:
13.10.2 管理视图 1、查看、修改视图 在SQL SERVER 中,通过SQL SERVER Enterprise Manager 查看和修改视图主要执行以下步骤: (1) 启动SQL SERVER Enterprise Manager,登录到指定的服务器; (2) 打开要创建视图的数据库文件夹,选中view 图标,此时在右面的窗格中显示当前数据库的所有视图; (3) 右击要查看的视图,在弹出菜单中选择Properties 选项,打开View Properties 对话框,如图13-3 所示;
(4) 在该对话框内可浏览到该视图的正文,也可以对该视图进行修改,然后单击Check Syntax 按钮来对语句合法性进行检查,若要对视图的访问权限进行设置,请单击Permissions 按钮。 2 使用存储过程检查视图
系统过程sp_help 用来返回有关数据库对象的详细信息,如果不针对某一特定对象,则返回数据库中所有对象信息其语法如下: sp_help 数据库对象名称 系统过程sp_helptext 检索出视图、触发器、存储过程的文本。其语法为: sp_helptext 视图(触发器、存储过程)
3 删除视图 删除视图与删除表一样都使用DROP 命令。其语法为: DROP VIEW 视图名称
在创建视图前请考虑如下准则:
只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其他数据库甚至其他服务器中。
视图名称必须遵循标识符的规则,且对每个架构都必须唯一。此外,该名称不得与该架构包含的任何表的名称相同。 您可以对其他视图创建视图。Microsoft SQL Server 2005 允许嵌套视图。但嵌套不得超过 32 层。根据视图的复杂性及可用内存,视图嵌套的实际限制可能低于该值。 不能将规则或 DEFAULT 定义与视图相关联。 不能将 AFTER 触发器与视图相关联,只有 INSTEAD OF 触发器可以与之相关联。 定义视图的查询不能包含 COMPUTE 子句、COMPUTE BY 子句或 INTO 关键字。 定义视图的查询不能包含 ORDER BY 子句,除非在 SELECT 语句的选择列表中还有一个 TOP 子句。 定义视图的查询不能包含指定查询提示的 OPTION 子句。 定义视图的查询不能包含 TABLESAMPLE 子句。 不能为视图定义全文索引定义。 不能创建临时视图,也不能对临时表创建视图。 不能删除参与到使用 SCHEMABINDING 子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响该视图的定义,则这些语句将会失败。 尽管查询引用一个已配置全文索引的表时,视图定义可以包含全文查询,仍然不能对视图执行全文查询。 下列情况下必须指定视图中每列的名称: 视图中的任何列都是从算术表达式、内置函数或常量派生而来。 视图中有两列或多列原应具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同表的列具有相同的名称)。 希望为视图中的列指定一个与其源列不同的名称。(也可以在视图中重命名列。)无论重命名与否,视图列都会继承其源列的数据类型。 注意: 此规则在视图基于包含外部联接的查询时不适用,因为列可能从不支持空值转而支持空值。 其他情况下,无需在创建视图时指定列名。SQL Server 会为视图中的列指定与定义视图的查询所引用的列相同的名称和数据类型。选择列表可以是基表中列名的完整列表,也可以是其部分列表。 若要创建视图,必须获得数据库所有者授予您创建视图的权限,并且如果使用架构绑定创建视图,您必须对视图定义中所引用的表或视图具有适当权限。
默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,创建一个定义视图的查询,该视图从表中检索员工的薪水低于 $30,000 的所有行。如果员工的薪水涨到 $32,000,因其薪水不符合视图所设条件,查询时视图不再显示该特定员工。但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设条件。如果使用该子句,则对行的修改不能导致行从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误。
可对敏感性视图的定义进行加密,以确保不让任何人得到它的定义,包括视图的所有者。
|