使用视图的情况

视图通常用来集中、简化和自定义每个用户对数据库的不同认识。视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。还可以在向 Microsoft SQL Server 复制数据和从其中复制数据时使用视图,以便提高性能并对数据进行分区。

着重于特定数据

视图使用户能够着重于他们所感兴趣的特定数据和所负责的特定任务。不必要的数据或敏感数据可以不出现在视图中。

例如,AdventureWorks2008R2 示例数据库中的视图 vBikes 允许用户查看当前库存的所有自行车的名称。该视图将从 Product 表中筛选掉除 Name 之外的所有字段,并仅返回自行车成品的名称,而不是自行车配件的名称。

CREATE VIEW vBikes AS
SELECT DISTINCT p.[Name] FROM Production.Product p
    JOIN Production.ProductInventory i ON p.ProductID = i.ProductID
    JOIN Production.ProductSubCategory ps 
        ON p.ProductSubcategoryID = ps.ProductSubCategoryID 
    JOIN Production.ProductCategory pc 
        ON (ps.ProductCategoryID = pc.ProductCategoryID 
            AND pc.Name = N'Bikes')
        AND i.Quantity > 0

简化数据操作

视图可以简化用户处理数据的方式。可以将常用联接、投影、UNION 查询和 SELECT 查询定义为视图,以便使用户不必在每次对该数据执行附加操作时指定所有条件和条件限定。例如,可以将一个用于报表目的且执行子查询、外联接和聚合来从一组表中检索数据的复杂查询创建为视图。视图简化了对数据的访问,因为每次生成报表时无需编写或提交基础查询,而是查询视图。有关对数据进行操作的详细信息,请参阅查询基础知识

尽管不是复杂查询,AdventureWorks2008R2 示例数据库中的视图 vBikes 仍允许用户着重于特定数据,而不必构造生成视图所需的 JOIN 子句。

还可以创建用户定义的内联函数,在逻辑上作为参数化视图运行,或者作为在 WHERE 子句搜索条件或查询的其他部分中含有参数的视图运行。有关详细信息,请参阅内联用户定义函数

提供向后兼容性

视图使您能够在表的架构更改时为表创建向后兼容接口。例如,一个应用程序可能引用了具有以下架构的非规范化表:

Employee(Name, BirthDate, Salary, Department, BuildingName)

若要避免在数据库中重复存储数据,可以通过将该表拆分为下列两个表来规范化该表:

Employee2(Name, BirthDate, Salary, DeptId)

Department(DeptId, BuildingName)

若要提供仍然可引用 Employee 中数据的向后兼容接口,可以删除旧的 Employee 表并以以下视图中的内容替换它:

CREATE VIEW Employee AS
SELECT Name, BirthDate, Salary, BuildingName
FROM Employee2 e, Department d
WHERE e.DeptId = d.DeptId

用以查询 Employee 表的应用程序现在可以从 Employee 视图获取数据。如果应用程序只是读取 Employee,则不必更改应用程序。通过将 INSTEAD OF 触发器添加到新视图以将视图中的 INSERT、DELETE 和 UPDATE 操作映射到基础表中,在某些时候还可以为更新 Employee 的应用程序提供支持。有关详细信息,请参阅设计 INSTEAD OF 触发器

自定义数据

视图允许用户以不同方式查看数据,即使在他们同时使用相同的数据时也是如此。这在具有许多不同目的和技术水平的用户共用同一数据库时尤其有用。例如,可创建一个视图以仅检索由客户经理处理的客户数据。该视图可以根据使用它的客户经理的登录 ID 决定检索哪些数据。

导出和导入数据

可使用视图将数据导出到其他应用程序。例如,您可能希望使用 AdventureWorks2008R2 数据库中的 CustomerSalesOrderHeader 表在 Microsoft Excel 中分析销售数据。为此,可基于 CustomerSalesOrderHeader 表创建视图。然后可以使用 bcp 实用工具导出视图定义的数据。如果使用 INSERT 语句可以在某些视图中插入行,那么使用 bcp 实用工具或 BULK INSERT 语句也可将数据文件中的数据导入视图。有关向视图中复制数据的限制的详细信息,请参阅 INSERT (Transact-SQL)。有关如何使用 bcp 实用工具和 BULK INSERT 语句复制视图中的数据或将数据复制到视图的详细信息,请参阅从视图大容量导出数据或将数据大容量导入视图

跨服务器组合分区数据

Transact-SQL UNION 集合运算符可在视图内使用,将单独表的两个或多个查询的结果组合到单一的结果集中。这在用户看来是一个单独的表,称为分区视图。例如,如果一个表包含华盛顿的销售数据,另一个表包含加利福尼亚的销售数据,则可以对这两个表使用 UNION 创建一个视图。该视图代表这两个地区的销售数据。

使用分区视图时,请您首先创建几个相同的表,指定一个约束以确定可在各个表中添加的数据范围。然后,使用这些基表创建视图。查询视图时,SQL Server 将自动确定查询所影响的表并仅引用这些表。例如,如果一个查询指定只需要华盛顿州的销售数据,SQL Server 将只读取包含华盛顿销售数据的表,而不访问其他表。

分区试图可基于来自多个异类源(如远程服务器)的数据以创建数据库服务器的联合体。例如,若要将分别存储组织中不同区域数据的几台远程服务器上的数据组合起来,可以创建分布式查询,从每个数据源中检索数据,然后基于这些分布式查询创建视图。所有查询都只读取包含查询所请求数据的远程服务器上的表中的数据,而不访问由视图中的分布式查询所引用的其他服务器。

跨多个服务器对数据进行分区时,只访问一部分数据的查询可以较快地运行,因为只需扫描较少的数据。如果表位于不同服务器上,或者位于一台使用多个处理器的计算机上,则还可以并行扫描该查询所涉及的每个表。这可以提高查询性能。此外,维护任务(例如重新生成索引或备份表)可更快地执行。

通过使用分区视图,数据的外观象是一个单一表,并且能以单一表的方式进行查询,而无需手动引用正确的基础表。

注意注意

对某个服务器的本地数据进行分区的首选方法是通过分区表。有关详细信息,请参阅已分区表和已分区索引

如果满足以下条件之一,则分区视图可以更新:

  • 具有逻辑的视图定义支持 INSERT、UPDATE 和 DELETE 语句的 INSTEAD OF 触发器。

  • 视图和 INSERT、UPDATE 及 DELETE 语句均遵循为可更新分区视图定义的规则。有关详细信息,请参阅创建分区视图