第6章 视图
视图是数据库的重要组成部分,在大部分的事务和分析型数据库中,都有大量的使用。SQL Server 2008为视图提供了多种重要的扩展特性,如分区视图等,这些新特性使数据库的灵活性和伸缩性得以提升。
本章重点:
❑ 掌握视图的概念和创建方法。
❑ 熟悉使用管理器和使用命令这两种创建方式。
❑ 熟悉视图的编辑和删除方法。
说明 AdventureWorks2008虽然很符合SQL Server 2008的各个特点,但对于初学者来说,有点太复杂了。本章通过微软从2000年就开始提供的数据库案例Northwind来介绍知识点的讲解。下载此案例最简单的方法就是去百度下“SQL Server 2000 Sample Databases”。很多网站提供下载,下载后直接生成数据库文件,附加在当前数据库服务器中即可。
6.1 了解视图
本节对视图做一个基础性的介绍。创建视图是一个相当简单的过程,然而理解视图的工作方式,将有助于更好地设计、使用和管理视图。
6.1.1 什么是视图
视图是通过定义查询建立的虚拟表。与普通的数据表一样,视图由一组数据列、数据行构成。由于视图返回的结果集,与数据表有相同的形式,因此可以像数据表一样使用。视图通常在以下情况使用。
❑ 从一张数据表中,取出一部分列或者一些数据行,形成一张虚拟表。通过这样的方式,可以向用户隐藏不必要的数据。
❑ 使用视图简化查询语句的实现。例如,先将两张或多张数据表联接、取交集,形成视图,再通过视图进行数据查询。
❑ 可以在视图中生成数据表的统计信息,用户可以直接使用这些统计信息。
案例介绍:在Northwind示例数据库中,存在有内在关系的两张表,如图6.1所示。有Products表(产品表),保存了产品的ID号和产品的详细信息;有Order Details表(订单详情表),保存了订单的信息,包括产品的ID和数据等信息。
图6.1 案例表的数据结构
单独的订单详情表只能够提供产品ProductID信息,而没有产品的名称、分类等信息。如果客户经理关心订单的产品详情等具体内容,可以通过视图将订单详情表与产品表进行联接,展示给客户经理完整的带有产品名称、分类的订单详情。
视图通常用于帮助用户关注他们感兴趣的数据,也可用于限制用户查看有权限访问的数据;视图也可以隐藏其背后复杂的表间关系;视图也可以过滤用户不必要知道或者不关心的信息,实现改善安全性的目的。例如,用户在没有被授予对表的访问权限的情况下,可以通过视图访问数据。
6.1.2 视图的种类
在SQL Server 2008数据库中,视图分为三种,标准视图是最为常用的视图,索引视图和分区视图是SQL Server 2008数据库中引入的新特性。本章将重点介绍标准视图的使用和一般特征。
❑ 标准视图:标准视图组合了一个或多个表中的数据,其重点放在特定数据上及简化数据操作。
❑ 索引视图:一般的视图是虚拟的,并不是实现保存在磁盘上的表,索引视图是被物理化了的视图,它已经过计算并记录在磁盘上。
❑ 分区视图:分区视图是由在一台或多台服务器间水平连接一组成员表中的分区数据形成的视图。
6.1.3 视图的优点
使用视图将会带来许多好处,它可以帮助用户建立更加安全的数据库,管理使用者可操作的数据,简化查询过程。使用视图的优点突出体现在以下几个方面。
❑ 关注用户数据:视图可以帮助用户建立一个可以管理的环境,它允许操作者访问指定的数据,并隐藏另一部分数据;不关心和不必要的数据信息可以不显示在视图中。操作者只能关注视图中显示的数据,而无法操作没有在视图中出现的表的数据。
❑ 隐藏复杂性:视图可以隐藏数据库设计的复杂性,它提供给开发人员改变数据库设计,而不影响用户和数据库的交互的能力。例如,在改变数据库的结构后,开发人员可以根据需要,对视图进行调整,使用户的使用保持一致性。
❑ 使查询更加灵活:通过视图,可以隐藏分布式查询背后的数据表的关联结构;用户可以通过查询视图,替代编写复杂的查询语句,或是复杂的T-SQL脚本。
❑ 简化权限的管理:视图也用于代替授权查询指定的列。数据库的所有者,可以向用户授予视图的相关权限,即可实现复杂的数据项的授权。
❑ 提高性能:视图也可用于处理复杂查询的结果。例如,需要使用的通过数据表生成的统计信息等。视图允许对数据进行分区,也允许将分区指定在不同计算机的不同分区上。
❑ 重新组织数据:可以创建联接多表等复杂的查询视图,用于导入导出数据到相关的应用系统中。
6.1.4 视图的约束
建立视图必须遵循相关的语法规则,同时,为了实现高级特性,SQL Server 2008数据库要求在创建视图前,考虑以下准则。
❑ 可以对其他视图创建视图,SQL Server 2008允许嵌套视图,但嵌套不得超过32层。
❑ 定义视图的查询不能包含COMPUTE子句、COMPUTE BY子句或INTO关键字。
❑ 定义视图的查询不能包含ORDER BY子句,除非在SELECT语句的选择列表中使用TOP子句。
❑ 定义视图的查询不能包含指定查询提示的OPTION子句,也不能包含TABLESAMPLE子句。
❑ 不能为视图定义全文索引定义。
❑ 不能创建临时视图,也不能对临时表创建视图。
❑ 不能删除参与到使用SCHEMABINDING子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。
6.2 在SQL Server Management Studio中创建视图
创建视图可以使用SQL Server Management Studio工具的查询设计器生成,也可以通过编写T-SQL语句来实现。使用T-SQL语句编写视图的方式比较灵活,但不易掌握;使用SQL Server Management Studio工具创建视图的方法更加直观,在本节中进行讲解。
6.2.1 使用SQL Server Management Studio创建标准视图
【实例6.1】用户可以通过SQL Server Management Studio的图形工具创建视图,通过SQL Server Management Studio完成下面的步骤来创建6.1.1节中的实例视图。
图6.2 SQL Server Management Studio工具界面
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”中,连接到SQL Server 2008数据库引擎实例,再展开该实例,选择Northwind数据库并展开,可以查看到“视图”节点,如图6.2所示。
图6.3 “添加表”对话框
(3)右击“视图”节点,在弹出的快捷菜单中选择“新建视图”命令,系统将显示“添加表”对话框,如图6.3所示。“添加表”对话框中有可操作的表、视图、函数和同义词标签。
(4)在“添加表”对话框中,选择数据表或者其他类型的数据对象。单击“Order Details”数据表和“Products”数据表,再单击“添加”按钮,查询设计器将以图形窗格的方式显示所选对象。
说明 要选择两个表,必须在单击鼠标的同时,按下Ctrl键。
(5)完成“添加表”对话框的操作时,单击“关闭”按钮。用户通过在查询设计器的快捷菜单中选择“添加表”命令,就可以随时再次调出该对话框。
(6)查询设计器从上到下分为4个部分,如图6.4所示。第一部分称“关系图”窗格,以可视化图形的方式显示数据表、视图以及表间关系等数据对象;第二部分称“网格”窗格,是对可用的数据表、列、视图以及别名等信息进行设置的操作界面;第三部分称“SQL”窗格,展示了通过操作界面处理而自动生成的T-SQL语句,该部分的T-SQL语句也可以直接通过手工编制来实现;第四部分称为“结果”窗格,以表格的形式显示视图的执行结果。
图6.4 视图设计界面
查询设计器的“关系图”窗格,显示了Order Details和Products数据表,以及它们之间的关联关系,如图6.4所示。同样,该关联关系已经在“SQL”窗格的T-SQL语句中展现出来,如下面语句的代码1部分:
01 SELECT FROM 02 dbo.[Order Details] INNER JOIN dbo.Products 03 ON dbo.[Order Details].ProductID = dbo.Products.ProductID --代码1
(7)默认没有显示视图属性的窗格。在右边的窗格中,单击视图名称的标签,然后按下F4键来显示视图的属性窗格。
(8)在查询设计器界面“关系图”窗格中,通过按顺序单击表的OrderID、ProductName、UnitPrice、Quantity、Discount列筛选视图中所要显示的数据列,如图6.5所示,选择完成以后,设计界面的中部和下部同样能够反映出操作的结果,这样就完成了简单的视图设计的过程。
图6.5 单击选择数据表前的列
(9)单击工具栏中的“保存”按钮,弹出“选择名称”对话框,输入要定义的名称“vOrderDetailsWithProductName”,单击“确定”按钮,这样就完成了创建一个简单视图的操作过程。事实上,在查询设计器中还有许多的选项,用于创建复杂的视图。
6.2.2 查看视图的结构信息
【实例6.2】用户可以通过以下方式,查看已创建视图的结构信息。
【方式一】在SQL Server Management Studio的对象资源管理器中,单击“视图”节点,在展开的子目录中,可以查看到视图“dbo.vOrderDetailsWithProductName”,如图6.6所示。
【方式二】系统也可以使用T-SQL语句,通过查看“系统目录视图”的方式,获取视图的基础信息。单击工具栏中的“新建查询”按钮,在“SQL”窗格中输入以下语句,再单击工具栏中的“执行”按钮显示结果。
01 USE Northwind 02 GO 03 SELECT * FROM sys.views WHERE NAME ='vOrderDetailsWithProductName' --代码1 04 SELECT * FROM sys.columns WHERE OBJECT_ID IN ( --代码2 05 SELECT object_id FROM sys.views WHERE 06 NAME ='vOrderDetailsWithProductName' 07 )
【代码说明】
❑ 通过代码第3行的执行,可以获取如创建时间等视图的基础信息。
❑ 通过代码第4行的执行,可以获取视图所对应的数据列的基础信息。
6.2.3 查看视图的结果
【实例6.3】可以通过浏览视图的数据来检查视图创建的是否正确,查看已创建视图的执行结果信息可以通过以下方式。
【方式一】在SQL Server Management Studio工具的对象资源管理器中,右击要查看的视图“dbo.vOrderDetailsWithProductName”节点,在弹出的快捷菜单中选择“打开视图”命令,将在“结果”窗格中显示从该视图获取的数据。
图6.6 查看视图
【方式二】使用T-SQL语句查询视图数据,单击工具栏中的“新建查询”按钮,在“SQL”窗格中输入如下语句,再单击工具栏中的“执行”按钮,显示查询结果。
01 USE Northwind 02 GO 03 SELECT [OrderID] 04 ,[UnitPrice] 05 ,[Quantity] 06 ,[Discount] 07 ,[ProductName] 08 FROM [Northwind].[dbo].[vOrderDetailsWithProductName]
【代码说明】
❑ 使用第3~8行的SELECT语句查询视图数据,语法同查询数据表。
❑ 不要忘记先使用第1行打开数据库。
6.3 用CREATE VIEW创建视图
创建视图的另一种方式是使用T-SQL语句,这种方式更加灵活。对于高级数据库管理员,可以将要创建的视图,通过T-SQL语句的方式进行保存,便于以后的管理。对于加密视图等高级特性的使用,T-SQL语句也是维护视图的重要方式,使用CREATE VIEW创建视图的实例如下。
6.3.1 使用CREATE VIEW创建视图的实例
【实例6.4】用户可以使用SQL Server Management Studio工具编写CREATE VIEW代码,具体操作如下所示,可以建立6.1.1节所述的视图。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。
(2)在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE Northwind 02 GO 03 IF OBJECT_ID ('vOrderDetailsWithProductName', 'V') IS NOT NULL 04 DROP VIEW vOrderDetailsWithProductName; 05 GO 06 CREATE VIEW vOrderDetailsWithProductName 07 AS 08 SELECT [Order Details].OrderID 09 ,Products.ProductName 10 ,[Order Details].UnitPrice 11 ,[Order Details].Quantity 12 ,[Order Details].Discount 13 FROM dbo.[Order Details] INNER JOIN dbo.Products 14 ON dbo.[Order Details].ProductID = dbo.Products.ProductID 15 GO
【代码说明】
❑ 第6行的CREATE VIEW后跟视图名称“vOrderDetailsWithProductName”。
❑ 第3行的OBJECT_ID为系统函数,用于返回数据对象的标识号。
❑ 第7行AS后面的代码为查询语句。
(3)在“消息”窗格中提示“命令已成功完成”。按6.2.3节所述的方法,查询并验证该视图。
6.3.2 基本语法
T-SQL的CREATE VIEW语句符合一般的SQL语法;同时,在SQL Server 2008数据库中增加了大量的扩展选项,以实现高级特性。具体语法如下:
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] [ WITH <view_attribute> [ ,...n ] ] AS select_statement [ ; ] [ WITH CHECK OPTION ] <view_attribute> ::= { [ ENCRYPTION ] [ SCHEMABINDING ] }
【语法说明】
❑ schema_name项:指定视图所属架构的名称。
❑ view_name项:代表视图的名称。
❑ column项:指定视图中的列使用的名称。
❑ AS项:指定视图要执行的操作。
❑ select_statement项:用于定义视图的查询语句。该语句可以使用多个表和其他视图。
❑ CHECK OPTION项:强制针对视图执行的所有数据修改语句,都必须符合在select_statement中设置的条件。
❑ ENCRYPTION项:对sys.syscomments表中包含CREATE VIEW语句文本的条目进行加密。
❑ SCHEMABINDING项:将视图绑定到基础表的架构。如果指定了SCHEMABINDING,则不能按照将影响视图定义的方式修改基表或表。
6.3.3 操作实例
本小节通过各类实例说明视图的应用场景,所有实例以AdventureWorks2008案例数据库为背景。通过CREATE VIEW语句,说明各种选项的使用方式。
注意 AdventureWorks和AdventureWorks2008是同时被安装的两个数据库,不同的是AdventureWorks更简单,符合SQL Server 2005数据库要求,而AdventureWorks2008更高级,对初学者而言有一定的难度。
1. 创建简单的视图
【实例6.5】使用CREATE VIEW创建一个简单的视图,用于从示例数据库的员工表和联系人数据表中,查全部员工雇用日期数据,具体操作请参考如下步骤。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。
(2)在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE AdventureWorks2008 02 GO 03 CREATE VIEW view_test_7_1 04 AS 05 SELECT c.ModifiedDate, e.BusinessEntityID, e.HireDate 06 FROM HumanResources.Employee e JOIN Person.BusinessEntity c on e.BusinessEntityID = 07 c.BusinessEntityID ; 08 GO
【代码说明】
❑ 从第6行可以看出,此视图的数据来自AdventureWorks2008数据库的HumanResources.Employee和Person. BusinessEntity表。这些数据提供有关AW自行车公司的员工的姓名和雇用日期信息。
❑ 对于负责跟踪工作年限的用户,可创建此视图,同时不授予此人访问这些表中的所有数据的权限。
2. 创建加密视图的实例
【实例6.6】以下实例使用CREATE VIEW创建视图,并使用WITH ENCRYPTION选项,将视图进行加密,该视图返回Production.Product数据表中颜色为黑色的产品列表。具体操作如下所示。
执行过程同1中的步骤,输入如下代码。
01 USE AdventureWorks2008 02 GO 03 CREATE VIEW view_test_7_2 04 --代码1 05 WITH ENCRYPTION 06 AS 07 SELECT * 08 FROM Production.Product 09 WHERE Color='Black' 10 GO
【代码说明】
❑ 参考6.3.2节的语法,第5行的WITH ENCRYPTION选项写在AS关键字前,如代码中的代码1部分。
❑ 使用WITH ENCRYPTION选项创建加密的视图,在对象资源管理器视图目录的图标上,将使用一个带有“锁”的视图图标;同时右击该“视图”节点,弹出的快捷菜单上的“设计”命令为灰色表示禁用,如图6.7所示。
图6.7 查看视图
注意 在使用加密选项创建视图前,应备份好未加密的源T-SQL代码,方便以后修改。
3. 保护视图中条件列不被修改的实例
【实例6.7】以下实例创建一个视图,使用了WITH CHECK OPTION选项,该视图返回Production. Product数据表中颜色为黑色的产品列表,用户不能够修改条件列Color的值。具体操作请参考如下步骤。
执行过程同1中的步骤,输入如下代码。
01 USE AdventureWorks2008 02 GO 03 CREATE VIEW view_test_7_3 04 --代码 05 AS 06 SELECT * 07 FROM Production.Product 08 WHERE Color='Black' 09 WITH CHECK OPTION ; --代码1 10 GO
【代码说明】
❑ 以上实例显示名为view_test_7_3的视图,此视图允许进行数据修改,除了条件列。
❑ 第9行的WITH CHECK OPTION写在CREATE VIEW的代码段的最后,如代码1部分所示。
❑ WITH CHECK OPTION强制对视图的修改语句都必须符合在select_statement中设置的条件,即不能够修改Color字段。
【运行效果】如果尝试修改视图的Color字段,系统将提示“不符合CHECK OPTION”约束,如图6.8所示。
图6.8 不符合CHECK OPTION约束的提示
4. 创建使用内置函数的视图
【实例6.8】以下实例创建一个视图,在创建视图中使用了内置函数SUM,用来统计销售人员的销售额的信息,具体操作请参考如下步骤。
执行过程同1中的步骤,输入如下代码。
01 --1.检查数据 02 USE AdventureWorks2008 03 GO 04 CREATE VIEW view_test_7_4 05 AS 06 SELECT TOP 100 SalesPersonID AS N'编号', SUM(TotalDue) AS N'总的销售' 07 FROM Sales.SalesOrderHeader 08 GROUP BY SalesPersonID 09 ORDER BY N'总的销售' DESC ; 10 --2.检查数据 11 SELECT * FROM view_test_7_4; 12 GO
【代码说明】
❑ 以上实例显示包含内置函数的视图定义。
❑ 第6行的SUM是函数,用于统计一组数据的和,在本示例中用于统计销售合计,函数将在第10章进行详细说明。
❑ 使用函数时,必须为派生列指定一个列名。
❑ 第8行根据GROUP BY SalesPersonID进行分组统计,将分组的数据通过SUM内置函数合计,并通过AS设定视图的列名称。
图6.9 查看该视图
【运行效果】通过第11行查看数据,如图6.9所示。
6.4 在SQL Server Management Studio中修改视图
视图定义之后,可以更改视图的名称或视图的定义而无须删除并重新创建视图。删除并重新创建视图会造成与该视图关联的权限丢失。使用SQL Server Management Studio工具的查询设计器可以创建视图,也同样可以修改视图。本节将讲述在SQL Server Management Studio工具中修改视图的过程,并举例说明。
6.4.1 使用SQL Server Management Studio修改简单的视图
【实例6.9】通过SQL Server Management Studio完成下面的步骤,修改6.3.1节中创建的实例视图,实现在视图中增加产品的供应商信息。
(1)在SQL Server Management Studio的对象资源管理器中,选择Northwind数据库并展开,可以查看到“视图”节点,展开该节点,查找“dbo.vOrderDetailsWithProductName”视图节点,如图6.10所示。
图6.10 查看视图
(2)右击“dbo.vOrderDetailsWithProductName”视图节点,在弹出的快捷菜单中选择“设计”命令,在SQL Server Management Studio工具中将显示查询设计器。
(3)在查询设计器中,通过快捷菜单选择“添加表”命令,在“添加表”对话框中选择“Suppliers”表,在“关系图”窗格中,可以看到该数据表和“Products”表与“Suppliers”表的外键关系,如图6.11所示。
图6.11 查询设计器
(4)在“关系图”窗格中,选择“Suppliers”表的“CompanyName”字段,右击“关系图”窗格,在弹出的快捷菜单中选择“执行SQL”命令,修改后的视图在“结果”窗格中显示结果。
这样,就完成了通过查询设计器,在视图中增加产品供应商的信息—“CompanyName”列。
6.4.2 使用SQL Server Management Studio修改视图的一般过程
用户也可以通过SQL Server Management Studio工具修改视图。修改视图的一般过程可以参考以下步骤。
1. 修改视图设计
【实例6.10】修改视图设计,具体操作请参考如下步骤。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”中,连接到SQL Server 2008数据库引擎实例,再展开该实例。
(3)在“对象资源管理器”中,选择视图所在的数据库,展开“视图”节点,查找到要修改的视图。
(4)右击“视图”节点,在弹出的快捷菜单中选择“设计”命令,调出查询设计器,如图6.10所示。
(5)可以在查询设计器的操作窗格中修改视图。修改通过窗格中的快捷菜单来完成,主要包括“执行SQL”、“添加分组依据”、“添加表”、“添加新派生表”命令。
(6)“执行SQL”命令用于执行已经生成的T-SQL语句,该语句显示在“SQL”窗格中。
(7)该T-SQL语句可以通过“关系图”窗格、“条件”窗格的操作自动生成;也可以通过在“SQL”窗格中直接编写或修改T-SQL语句生成。
(8)用户可以通过在查询设计器的快捷菜单中选择“添加表”命令,随时调出“添加表”对话框,添加表或表值对象。
(9)可以通过“执行SQL”命令,查看修改后的视图查询结果,结果将显示在“结果”窗格中。
2. 修改视图名称
【实例6.11】修改视图名称,具体操作请参考如下步骤。
执行1中的(1)~(2)步,在SQL Server Management Studio的对象资源管理器中,右击“视图”节点,在弹出的快捷菜单中选择“重命名”命令。这时,视图名称将变为激活的状态,如图6.12所示。在激活的文本框中,修改视图名称,即可完成操作。
图6.12 重命名视图名称
6.5 用ALTER VIEW修改视图
修改视图的另一种方式是使用T-SQL语句,该方式和使用CREATE VIEW语句一样,虽然不直观,但更加灵活。本节将举例说明。
6.5.1 使用ALTER VIEW修改视图的实例
【实例6.12】以下实例使用ALTER VIEW修改已经创建的视图。首先使用CREATE VIEW建立一个视图,返回示例数据库中Production.Product数据表中全部的数据,然后通过ALTER VIEW修改该视图,使得仅返回产品颜色为红色的数据。具体操作可以参考以下步骤。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。
(2)在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE AdventureWorks2008 02 GO 03 CREATE VIEW view_test_7_5 04 AS 05 SELECT * 06 FROM Production.Product 07 GO
【代码说明】
❑ 代码第5~6行表示从Production.Product数据表中返回所有列,建立view_test_7_5视图。
事实上,用户可能只关心Production.Product表中的部分产品信息,如红色的产品。用户可以通过ALTER VIEW修改该视图。
(3)在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE AdventureWorks2008 02 GO 03 ALTER VIEW view_test_7_5 04 --代码 05 AS 06 SELECT * 07 FROM Production.Product 08 WHERE Color = 'Red' 09 GO
【代码说明】
❑ 通过代码第8行,用户可以过滤不关心的数据,只保留必要的数据项。
6.5.2 基本语法
T-SQL的ALTER VIEW语句符合一般的SQL语法,同时在SQL Server 2008中有新的扩展选项,实现其高级特性。具体语法如下:
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ] [ WITH <view_attribute> [ ,...n ] ] AS select_statement [ ; ] [ WITH CHECK OPTION ] <view_attribute> ::= { [ ENCRYPTION ] [ SCHEMABINDING ] }
【参数说明】
❑ schema_name项:视图所属架构的名称。
❑ view_name项:要更改的视图。
❑ column项:将成为指定视图的一部分的一个或多个列的名称(以逗号分隔)。
❑ AS项:视图要执行的操作。
❑ select_statement项:定义视图的SELECT语句。
❑ WITH CHECK OPTION项:要求对该视图执行的所有数据修改语句都必须符合select_statement中所设置的条件。
❑ ENCRYPTION项:加密sys.syscomments中包含ALTER VIEW语句文本的项。
❑ SCHEMABINDING项:将视图绑定到基础表的架构。如果指定了SCHEMABINDING,则不能以可影响视图定义的方式来修改基表。
6.5.3 操作实例
本节列举使用ALTER VIEW对视图进行修改的几个示例,用户可以参考这些示例进行操作。
1. 修改员工视图
【实例6.13】以下实例创建一个包含所有员工及其雇佣日期的视图,要求更改该视图为选择雇佣日期在某个日期之前的员工。然后,使用ALTER VIEW替换该视图。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。
(2)在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE AdventureWorks2008 ; 02 GO 03 CREATE VIEW view_test_7_5 --1.创建视图 04 AS 05 SELECT c.ModifiedDate, e.HireDate 06 FROM HumanResources.Employee e JOIN Person.BusinessEntity c 07 ON e.BusinessEntityID = c.BusinessEntityID ; 08 GO
【代码说明】
❑ 代码第3~7行创建了一个包含所有雇员及其雇佣日期的视图。
实例要求,将视图更改为只包括在1999年之前雇佣的雇员。如果未使用ALTER VIEW,而是删除并重新创建视图,则必须重新输入先前用来处理与视图有关权限的GRANT语句和任何其他语句。而通过本例,用户可以直接实现设计的需要。
01 USE AdventureWorks2008 ; 02 GO 03 ALTER VIEW view_test_7_5 --2.修改视图 04 AS 05 SELECT c.ModifiedDate, e.HireDate 06 FROM HumanResources.Employee e JOIN Person.BusinessEntity c 07 ON e.BusinessEntityID = c.BusinessEntityID 08 WHERE HireDate < '1/1/2000' ; --3.修改的内容 09 GO
【代码说明】
❑ 代码第3~8行将视图更改为,只包括在1999年之前雇佣的雇员,即改变SELECT的条件语句。
❑ 代码第8行为具体修改的部分。
【运行效果】执行结果如图6.13所示,在视图中可以看到符合条件的员工共19人。
图6.13 执行结果
2. 修改视图的影响
修改视图并不会影响数据表所涉及的相关对象,但有的视图定义的更改,可能会导致相关对象的失败,请参考以下实例理解视图。
【实例6.14】在AdventureWorks示例数据库中创建view_test_7_6视图,用于返回编号列表,具体定义如下所示。
01 USE AdventureWorks2008 02 GO 03 CREATE VIEW view_test_7_6 04 AS 05 SELECT BusinessEntityID FROM HumanResources.Employee 06 GO
一个使用该视图的存储过程proc_test,从视图返回的数据中取得数据,具体定义如下所示。
07 USE AdventureWorks2008 08 GO 09 CREATE PROC proc_test 10 AS 11 SELECT BusinessEntityID from view_test_7_6
如果使用ALTER VIEW将view_test_7_6视图的定义修改为检索ModifiedDate列而不是BusinessEntityID,修改的定义如下所示,这样的视图修改将对前面的proc_test存储过程产生影响。
01 USE AdventureWorks2008 02 GO 03 ALTER VIEW view_test_7_6 04 AS 05 SELECT c.ModifiedDate FROM Person.BusinessEntity c 06 JOIN HumanResources.Employee e ON c.BusinessEntityID = e.BusinessEntityID 07 GO
【代码说明】
❑ 此时执行第7~11行的proc_test存储过程将失败,因为该视图中已不存在BusinessEntityID列。
❑ 存储过程将在第9章中进行详细说明,读者只需要了修改视图可能会产生影响即可。
6.6 通过视图修改数据
视图可以过滤掉用户不关心的数据,因此,通过视图修改数据既可以提高数据处理的工作效率,还可以提高数据操作的安全性。
6.6.1 使用视图修改数据的实例
【实例6.15】在视图中修改数据和在数据表中修改数据的操作一样。可以使用SQL Server Management Studio图形工具,也可以使用T-SQL语句修改数据。使用T-SQL在视图中修改数据可以参考9.6节。
使用SQL Server Management Studio图形工具修改数据的过程如下:
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”中,连接到SQL Server 2008数据库引擎实例,再展开该实例。
(3)在“对象资源管理器”中,选择AdventureWorks数据库并展开,可以查看到“视图”节点,展开该节点,查找“dbo.vEmployeeWithName”视图节点,如图6.14所示。
图6.14 打开视图
(4)右击“dbo.vEmployeeWithName”视图节点,在弹出的快捷菜单中选择“编辑前200行”命令,如图6.15所示,在SQL Server Management Studio工具的文档窗口中将显示数据结果。
图6.15 打开视图的结果
(5)可以通过查询设计器筛选要修改的数据行,单击数据表格中的数据项。ContactID为1209的数据,EmployeeID为1的数据行中VacationHours数据项为21,在数据表格中,通过单击“21”项,改为“25”,如图6.16所示。
图6.16 修改数据为25
(6)修改完成后,单击其他数据行,使修改的数据行失去焦点,SQL Server Management Studio工具将自动提交修改的信息。
(7)打开数据表,找到Employee为1的数据项,查看VacationHours的数据项为25项,如图6.17所示。
图6.17 查看数据项
6.6.2 操作说明总结
用户可以通过视图修改基础基表的数据,修改方式与通过UPDATE、INSERT和DELETE语句或使用bcp实用工具和BULK INSERT语句修改表中数据的方式一样。但是存在以下限制:
(1)任何对视图的修改都只能基于引用一个基表的数据列。
(2)视图中被修改的列,必须直接引用表列中的基础数据,而不能通过其他方式派生,如通过聚合函数(AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR和VARP)、计算等生成数据列,使用集合运算符(UNION、UNION ALL、CROSSJOIN、EXCEPT和INTERSECT)形成的列得出的计算结果也不可更新。
(3)正在修改的列不受GROUP BY、HAVING或DISTINCT子句的影响。
6.7 在SQL Server Management Studio中删除视图
根据实际的需要,用户可能需要删除视图。与表的删除一样,视图可以通过多种方式进行删除,包括使用SQL Server Management Studio图形工具删除视图,也可以使用DDL语句进行删除。本节讲述使用SQL Server Management Studio图形工具删除视图的操作。
6.7.1 使用SQL Server Management Studio删除视图的实例
【实例6.16】本实例通过SQL Server Management Studio工具完成下面的步骤,删除前例中创建并修改的“dbo.vEmployeeWithName”视图,用户可以参考以下步骤删除视图。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”中,连接到SQL Server 2008数据库引擎实例,再展开该实例。
(3)在“对象资源管理器”中,选择AdventureWorks数据库,单击“数据库”节点,可以查看到“视图”节点,展开该节点,查找“dbo.vEmployeeWithName”视图节点,如图6.18所示。
图6.18 查看视图
(4)右击“dbo.vEmployeeWithName”视图节点,在弹出的快捷菜单中选择“删除”命令。
(5)在弹出的“删除对象”对话框中,如图6.19所示,单击“确定”按钮即可。
图6.19 删除视图
6.7.2 使用SQL Server Management Studio删除视图的一般过程
【实例6.17】使用SQL Server Management Studio图形工具删除视图的操作,可参考如下步骤。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”的“视图”目录中,选择要删除的视图,右击该节点,在弹出的快捷菜单中选择“删除”命令。
(3)在确认消息对话框中,单击“确定”按钮即可。
6.8 用DROP VIEW语句删除视图
从当前数据库中删除一个或多个视图,可以使用SQL Server Management Studio图形工具完成,也可以通过T-SQL语句实现。使用T-SQL语句往往用于批处理执行工作。
6.8.1 基本语法
使用DROP VIEW删除视图的语法如下如示。
DROP VIEW [ schema_name . ] view_name [ ...,n ] [ ; ]
【语法说明】
❑ schema_name项:指该视图所属架构的名称。
❑ view_name项:指要删除的视图的名称。
6.8.2 使用DROP VIEW语句创建视图的实例
【实例6.18】以下实例使用DROP VIEW语句删除视图vEmployeeWithName,具体操作可以参考如下步骤:
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。在SQL Server Management Studio工具中,单击“新建查询”按钮,打开一个“新建查询”窗口。
(2)在查询窗口中,输入如下代码,并单击“执行”按钮。
01 USE AdventureWorks2008 ; 02 GO 03 IF OBJECT_ID (' vEmployeeWithName ', 'view') IS NOT NULL --使用函数判断数据对象的存在 04 DROP VIEW vEmployeeWithName ; 05 GO
【代码说明】
❑ 第3行使用OBJECT_ID函数判断数据对象的存在
❑ 第4行使用DROP VIEW删除视图数据对象。
❑ 执行成功即完成删除。
6.9 小结
本章学习了如何创建并管理视图,在创建和修改每个视图时,我们都可以通过两种方法去实现它。本章使用了两个实例数据库:Northwind和AdventureWorks2008。这些数据库都不相同,内容也不同,很多时候因为某个数据库不完善,没法提供一个效果,我们都可能会用到另外一个数据库,所以读者在编写本章的代码时一定要清楚具体要操作哪个数据库。
6.10 本章练习
1. 视图是一种________表,其数据存放在___________。
2. 在SQL Server 2008中,把视图分为了________、________和________3类。
3. 使用__________语句对视图进行加密。
4. 视图的优缺点是什么?创建视图时应注意什么问题?
5. 在视图中插入、修改、删除数据需要注意什么?发生错误的一般原因有哪些?
6. 在创建视图时可否用distinct或group by语句?如果能使用需要注意什么问题?