SQL 2000/2005 中的视图






3.28/5 (17投票s)
对 SQL Server 2000/2005 中的视图及其优势的解释
本文的目标
- 提高对 SQL 2000/2005 中视图的理解
- 解释视图如何提高数据库安全性
- 解释如何加密视图,使其无法看到源表
- 演示使用以下方法构建视图
- T-SQL 语句
- Microsoft SQL 2000 企业管理器
- SQL 2005 管理工作室
- 解释并演示如何在视图中连接两个表
- 演示视图中的子查询
什么是 View?
视图本质上是存储在数据库中的一个查询对象。从本质上讲,视图可以看作是一个虚拟表,它本身不包含任何数据或信息。视图可以返回与任何 SELECT
语句相同的查询结果。视图实现为已存储的 SELECT
语句,几乎没有开销,因为它们实际上不存储数据。然而,视图不是一个用于使用 T-SQL 命令处理数据的工具,而存储过程是。视图一次只能包含一个查询。因此,视图更像是一个查询而不是存储过程。就像存储过程或查询编辑器窗格中的查询一样,您可以包含运行在不同服务器上的数据库中的表。只要用户 ID 具有必要的安全凭据,就可以包含多个数据库中的表。
视图的来源和原因?
在 Microsoft SQL Server 的整个历史中,视图一直存在。在处理完全规范化的数据库和查询数据时,通常需要编写复杂的连接、聚合、函数以及大量的其他 T_SQL 函数来生成结果。为了隐藏这种复杂性,可以将此语句创建为视图,然后就可以对该视图执行将来的查询。
Oracle 等产品提出了物化视图的概念,提供了额外的性能。然而,使用返回非常大结果集的视图可能会导致性能不佳,因为结果集没有索引,并且如果视图用于连接或子查询,则必须对整个结果进行表扫描。对此问题的 T-SQL 解决方案是通过能够对视图建立索引。因此,随着 SQL Server 产品线的不断发展,并且为了响应 Oracle 的物化视图,Microsoft SQL Server 2000 推出了一项新功能,称为视图索引。视图索引使产品能够定义视图上的索引。此外,SQL Server 视图索引是动态的,因为对基表数据的更改会自动反映在索引视图中。另外,SQL Server 查询优化器会尝试使用索引视图,即使该视图未在 T-SQL 命令的 FROM 子句中引用。这些功能在 Oracle 的物化视图中不可用。
视图的优点
- 限制数据访问和/或简化数据访问
可以使用视图限制用户只能使用表中的几列。例如,如果我们不希望用户因安全原因能够访问所有列。但这也可以是因为并非所有列都对用户感兴趣。还可以使用WHERE
子句限制对行的访问。如果我们使用USER_ID()
,我们甚至可以找出谁在使用视图,并只返回与该用户相关的数据。此外,视图可以连接多个数据库、多个服务器上的多个表,但用户使用的只是视图的名称。简单而强大! - 简化数据操作
我们还可以使用视图来操作数据。通常,对于关系数据库设计,这意味着必须连接许多表。使用视图可以简化这一点,用户无需了解涉及的所有表。 - 导入和导出数据
视图还可以用于将数据导入/导出到/从另一个应用程序。bcp 实用程序和 BULK INSERT 都使用视图。 - 合并数据
所谓的分布式分区视图可用于合并多个数据库中多个表的数据,使其看起来像一个表,但实际上是多个表。这可以通过使用UNION
运算符来实现。例如,如果我们有欧洲和美国的客户,我们可以在欧洲有一个服务器,在有美国有一个服务器,拥有相同的表,然后在一个分布式分区视图中合并所有数据。
创建视图是否有指南?
选择一个直观的名称来定义您的视图,例如 dbo.Customer_Order_View
,所有者名称是可选的,但应指定以避免拥有权链断裂(假设引用的 DB 对象由 DBO 拥有)。创建视图时,会验证引用的对象的存在。如果所有者与视图的所有者不同,则需要 SELECT
权限。如果视图引用派生列,或者来自多个表的列同名,则必须指定列名。可以为列指定别名,使其对用户更友好。
- 提示:在创建视图之前,请测试
select
语句以确保其返回所需结果。这也可以是测试查询性能的好时机。
创建视图是否有任何限制?
- Create view 语句不能包含
INTO
关键字或COMPUTE
/COMPUTE BY
子句 ORDER BY
子句只能与TOP
关键字一起指定。- 视图不能在批处理 T-SQL 语句中合并
- 视图可以引用的最大列数为 1024
- 视图不能引用任何临时表
- 视图只能在当前数据库中创建。
create view
语句不允许您指定数据库名称。
如何创建视图?
根据您使用的 SQL Server 版本,可以通过多种方式创建视图
- 使用 T-SQL 语句
- 使用企业管理器
- 使用 SQL 2005 管理工作室
如何使用 T-SQL 语法创建视图?
CREATE VIEW owner.viewname [(Column[,n])]
select statement
[WITH CHECK OPTION]
示例
CREATE VIEW uk_employee_view
SELECT * FROM employee WHERE country = 'UK'
WITH CHECK OPTION
WITH CHECK OPTION 是什么?
如果视图已定义了 WITH CHECK OPTION
,则对基础数据的任何修改都可能导致该数据不再可通过视图访问。这强制所有针对视图执行的数据修改语句都必须符合 select_statement 中设定的条件。当通过视图修改行时,WITH CHECK OPTION
确保数据在修改提交后仍然可通过视图可见。
使用 SQL 2000 企业管理器创建视图
您可以通过访问视图设计器在企业管理器中创建视图。要访问视图设计器,请右键单击相应数据库中的视图并选择“新建视图”。视图设计器实际上基于查询设计器,只有一个细微差别 - 当您选择保存时,系统会提示您输入视图的名称,并且您构建的查询将作为视图定义存储。
进入视图设计器后,您可以单击“添加表”图标(工具栏中最右边的图标)。选择相应列的复选框会将它们添加到将作为视图定义保存的 select
语句中。
要更改视图的属性,例如添加 WITH CHECK
选项,请选择属性图标或右键单击并从弹出菜单中选择属性。
使用 SQL2005 管理工作室创建视图
在 SQL 管理工作室中,导航到您想要创建视图的数据库。在树状视图中导航到“视图”节点并右键单击它。这将弹出一个菜单,其中“新建视图”是其中一个选项。从这里开始,过程与 SQL 2000 非常相似。
如何将视图用作安全措施?
作为开发人员,您在构建视图时的一个顾虑是,当有人更改视图中使用的基础表的结构时会发生什么。这会导致问题。我将向您展示如何解决此问题并保护视图的构建,以防止此类事情发生。
如何以及为何要加密视图定义?
您会发现视图被加密的最常见情况是使用视图
从数据库返回特定信息。您也不希望任何人看到该信息是如何返回的,例如,不允许承包商应用程序开发人员查看源数据库的结构。加密构成视图的 T-SQL 代码,这意味着信息的返回方式将不可见。
- 提示:在加密视图之前,请确保您已将原始源的副本安全地保存在源代码管理系统中,因为一旦视图被加密,就很难恢复到其原始状态。
索引视图
就像表可以被索引一样,视图也可以被索引,用于选择用于索引的列的规则与表类似,但是,在索引视图之前需要满足一些主要要求。
创建的第一个索引必须是唯一聚集索引,一旦创建了此索引,就可以创建视图上的其他非聚集索引。在此需要注意的一个重要事项是,如果您删除了视图上的聚集索引,那么该视图上的所有后续索引都将被自动删除。另外,如果我们删除视图,所有索引也将被删除。要构建索引的视图只能包含表,而不能包含其他视图。所有表必须来自同一个数据库,视图也必须驻留在该数据库中,并且必须使用 SCHEMABINDING 选项构建。
在视图上创建索引时,以下选项必须设置为 ON
。这些选项只需要为该会话设置为 ON
,因此应在 CREATE INDEX
语句之前。
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
/* */
SET NUMERIC_ROUNDABORT OFF
SET IGNORE_DUP_KEY OFF
待续...
历史
- 17/09/06 首次发布
- 04/03/07 添加了视图索引