65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL 2000/2005 中的视图

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (17投票s)

2006 年 9 月 17 日

CPOL

8分钟阅读

viewsIcon

113623

对 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 版本,可以通过多种方式创建视图

  1. 使用 T-SQL 语句
  2. 使用企业管理器
  3. 使用 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 添加了视图索引
© . All rights reserved.