设计和实现视图

创建视图之前,请考虑下列基本原则:

  • 只能在当前数据库中创建视图。 但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其他数据库甚至其他服务器中。

  • 视图名称必须遵循标识符的规则,且对每个架构都必须唯一。 此外,该名称不得与该架构包含的任何表的名称相同。

  • 您可以对其他视图创建视图。Microsoft SQL Server 允许嵌套视图。但嵌套不得超过 32 层。 根据视图的复杂性及可用内存,视图嵌套的实际限制可能低于该值。

  • 不能将规则或 DEFAULT 定义与视图相关联。

  • 不能将 AFTER 触发器与视图相关联,只有 INSTEAD OF 触发器可以与之相关联。

  • 定义视图的查询不能包含 COMPUTE 子句、COMPUTE BY 子句或 INTO 关键字。

  • 定义视图的查询不能包含 ORDER BY 子句,除非在 SELECT 语句的选择列表中还有一个 TOP 子句。

  • 定义视图的查询不能包含指定查询提示的 OPTION 子句。

  • 定义视图的查询不能包含 TABLESAMPLE 子句。

  • 不能为视图定义全文索引定义。

  • 不能创建临时视图,也不能对临时表创建视图。

  • 不能删除参与到使用 SCHEMABINDING 子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。 另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响该视图的定义,则这些语句将会失败。

  • 如果未使用 SCHEMABINDING 子句创建视图,则对视图下影响视图定义的对象进行更改时,应运行 sp_refreshview。 否则,当查询视图时,可能会生成意外结果。

  • 尽管查询引用一个已配置全文索引的表时,视图定义可以包含全文查询,仍然不能对视图执行全文查询。

  • 下列情况下必须指定视图中每列的名称:

    • 视图中的任何列都是从算术表达式、内置函数或常量派生而来。

    • 视图中有两列或多列原应具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同表的列具有相同的名称)。

    • 希望为视图中的列指定一个与其源列不同的名称。 (也可以在视图中重命名列。) 无论重命名与否,视图列都会继承其源列的数据类型。

      注意注意

      此规则在视图基于包含外部联接的查询时不适用,因为列可能从不支持空值转而支持 Null 值。

      其他情况下,无需在创建视图时指定列名。SQL Server 会为视图中的列指定与定义视图的查询所引用的列相同的名称和数据类型。 选择列表可以是基表中列名的完整列表,也可以是其部分列表。

若要创建视图,您必须获取由数据库所有者授予的此操作执行权限,如果使用 SCHEMABINDING 子句创建视图,则必须对视图定义中引用的任何表或视图具有相应的权限。

默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。 例如,创建一个定义视图的查询,该视图从表中检索员工的薪水低于 $30,000 的所有行。如果员工的薪水涨到 $32,000,因其薪水不符合视图所设条件,查询时视图不再显示该特定员工。 但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设条件。 如果使用该子句,则对行的修改不能导致行从视图中消失。 任何可能导致行消失的修改都会被取消,并显示错误。

创建视图