CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ] }
参数
schema_name
视图所属架构的名称。
view_name
视图的名称。视图名称必须符合有关标识符的规则。可以选择是否指定视图所有者名称。
column
视图中的列使用的名称。仅在下列情况下需要列名:列是从算术表达式、函数或常量派生的;两个或更多的列可能会具有相同的名称(通常是由于联接的原因);视图中的某个列的指定名称不同于其派生来源列的名称。还可以在 SELECT 语句中分配列名。
如果未指定 column,则视图列将获得与 SELECT 语句中的列相同的名称。
注意: |
在视图的各列中,列名的权限在 CREATE VIEW 或 ALTER VIEW 语句间均适用,与基础数据源无关。例如,如果在 CREATE VIEW 语句中授予了 SalesOrderID 列上的权限,则 ALTER VIEW 语句可以将 SalesOrderID 列改名(例如改为 OrderRef),但仍具有与使用 SalesOrderID 的视图相关联的权限。 |
AS
指定视图要执行的操作。
select_statement
定义视图的 SELECT 语句。该语句可以使用多个表和其他视图。需要相应的权限才能在已创建视图的 SELECT 子句引用的对象中选择。
视图不必是具体某个表的行和列的简单子集。可以使用多个表或带任意复杂性的 SELECT 子句的其他视图创建视图。
在索引视图定义中,SELECT 语句必须是单个表的语句或带有可选聚合的多表 JOIN。
视图定义中的 SELECT 子句不能包括下列内容:
∙ COMPUTE 或 COMPUTE BY 子句
∙ ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句。
注意: |
ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。 |
∙ INTO 关键字
∙ OPTION 子句
∙ 引用临时表或表变量。
因为 select_statement 使用 SELECT 语句,所以按照 FROM 子句的指定,使用 <join_hint> 和 <table_hint> 提示是有效的。有关详细信息,请参阅 FROM (Transact-SQL) 和 SELECT (Transact-SQL)。
UNION 或 UNION ALL 分隔的函数和多个 SELECT 语句可在 select_statement 中使用。
CHECK OPTION
强制针对视图执行的所有数据修改语句都必须符合在 select_statement 中设置的条件。通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到数据。
注意: |
即使指定了 CHECK OPTION,也不能依据视图来验证任何直接对视图的基础表执行的更新。 |
ENCRYPTION
对 sys.syscomments 表中包含 CREATE VIEW 语句文本的项进行加密。使用 WITH ENCRYPTION 可防止在 SQL Server 复制过程中发布视图。
SCHEMABINDING
将视图绑定到基础表的架构。如果指定了 SCHEMABINDING,则不能按照将影响视图定义的方式修改基表或表。必须首先修改或删除视图定义本身,才能删除将要修改的表的依赖关系。使用 SCHEMABINDING 时,select_statement 必须包含所引用的表、视图或用户定义函数的两部分名称 (schema.object)。所有被引用对象都必须在同一个数据库内。
不能删除参与了使用 SCHEMABINDING 子句创建的视图的视图或表,除非该视图已被删除或更改而不再具有架构绑定。否则,Microsoft SQL Server 2005 数据库引擎 将引发错误。另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响视图定义,则这些语句将会失败。
如果视图包含别名数据类型列,则无法指定 SCHEMABINDING。
VIEW_METADATA
指定为引用视图的查询请求浏览模式的元数据时,SQL Server 实例将向 DB-Library、ODBC 和 OLE DB API 返回有关视图的元数据信息,而不返回基表的元数据信息。浏览模式元数据是 SQL Server 实例向这些客户端 API 返回的附加元数据。如果使用此元数据,客户端 API 将可以实现可更新客户端游标。浏览模式的元数据包含结果集中的列所属的基表的相关信息。
对于使用 VIEW_METADATA 创建的视图,浏览模式的元数据在描述结果集内视图中的列时,将返回视图名,而不返回基表名。
当使用 WITH VIEW_METADATA 创建视图时,如果该视图具有 INSTEAD OF INSERT 或 INSTEAD OF UPDATE 触发器,则视图的所有列(timestamp 列除外)都是可更新的。有关可更新视图的详细信息,请参阅“备注”。
备注
只能在当前数据库中创建视图。视图最多可以包含 1,024 列。
通过视图进行查询时,数据库引擎将进行检查以确保语句中任何位置被引用所有数据库对象都存在,这些对象在语句的上下文中有效,以及数据修改语句没有违反任何数据完整性规则。如果检查失败,将返回错误消息。如果检查成功,则将操作转换为对基础表的操作。
如果某个视图依赖于已删除的表(或视图),则当有人试图使用该视图时,数据库引擎将产生错误消息。如果创建了新表或视图(该表的结构与以前的基表没有不同之处)以替换删除的表或视图,则视图将再次可用。如果新表或视图的结构发生更改,则必须删除并重新创建该视图。
如果未使用 SCHEMABINDING 子句创建视图,则对视图下影响视图定义的对象进行更改时,应运行 sp_refreshview。否则,当查询视图时,可能会生成意外结果。
创建视图时,有关该视图的信息将存储在下列目录视图中:sys.views、lumns 和 sys.sql_dependencies。CREATE VIEW 语句的文本将存储在 sys.sql_modules 目录视图中。
对通过 numeric 或 float 表达式定义的视图使用索引所得到的查询结果,可能不同于不对视
图使用索引的类似查询所得到的结果。这种差异可能是由对基础表进行 INSERT、DELETE 或 UPDATE 操作时的舍入错误引起的。
创建视图时,数据库引擎将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。使用视图时,将使用这些原始设置来分析视图。因此,访问视图时,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的任何客户端会话设置都不会影响视图定义。
注意: |
兼容级别设置确定数据库引擎是将空字符串解释为单个空格还是真正的空字符串。如果兼容级别小于或等于 65,则数据库引擎将空字符串解释为单个空格。如果兼容级别等于或大于 70,则数据库引擎将空字符串解释为空字符串。有关详细信息,请参阅 sp_dbcmptlevel (Transact-SQL)。 |
可更新视图
只要满足下列条件,即可通过视图修改基础基表的数据:
∙ 任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。
∙ 视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生,如通过以下方式:
∙ 聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
sql sever 2008∙ 计算。不能从使用其他列的表达式中计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。
∙ 被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。
∙ TOP 在视图的 select_statement 中的任何位置都不会与 WITH CHECK OPTION 子句一起使用。
上述限制适用于视图的 FROM 子句中的任何子查询,就像其应用于视图本身一样。通常情况下,数据库引擎必须能够明确跟踪从视图定义到一个基表的修改。有关详细信息,请参阅通过视图修改数据。
如果上述限制妨碍直接通过视图修改数据,则可以考虑以下选项:
∙ INSTEAD OF 触发器
可以对视图创建 INSTEAD OF 触发器,以使视图可更新。将执行 INSTEAD OF 触发器,而不是执行对其定义了触发器的数据修改语句。此触发器允许用户指定必须发生以处理数据修改语句的操作集合。因此,如果存在给定的数据修改语句(INSERT、UPDATE 或 DELETE)的视图的 INSTEAD OF 触发器,则可通过该语句更新相应的视图。有关 INSTEAD OF 触发器的详细信息,请参阅设计 INSTEAD OF 触发器。
可以对视图创建 INSTEAD OF 触发器,以使视图可更新。将执行 INSTEAD OF 触发器,而不是执行对其定义了触发器的数据修改语句。此触发器允许用户指定必须发生以处理数据修改语句的操作集合。因此,如果存在给定的数据修改语句(INSERT、UPDATE 或 DELETE)的视图的 INSTEAD OF 触发器,则可通过该语句更新相应的视图。有关 INSTEAD OF 触发器的详细信息,请参阅设计 INSTEAD OF 触发器。
∙ 分区视图
如果视图为分区视图,则可遵循某些限制对其进行更新。必要时,数据库引擎将本地分区视图辨别为所有参与表和视图都在同一 SQL Server 实例上的视图,而将分布式分区视图辨别为视图中至少有一个表驻留在其他或远程服务器上的视图。
有关分区视图的详细信息,请参阅创建分区视图。
如果视图为分区视图,则可遵循某些限制对其进行更新。必要时,数据库引擎将本地分区视图辨别为所有参与表和视图都在同一 SQL Server 实例上的视图,而将分布式分区视图辨别为视图中至少有一个表驻留在其他或远程服务器上的视图。
有关分区视图的详细信息,请参阅创建分区视图。
分区视图
分区视图是通过对成员表使用 UNION ALL 所定义的视图,这些成员表的结构相同,但作为多个表分别存储在同一个 SQL Server 实例中,或存储在称为联合数据库服务器的自主 SQL Server 服务器实例组中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论