第七章视图

  • 格式:doc
  • 大小:55.00 KB
  • 文档页数:7

1 / 7 第七章 视图 本章学习目标:  为终端用户减少明显的数据库复杂性  防止敏感的列,但是仍然提供对其他重要数据的访问

视图的核心实际上仅仅是一个存储的查询。重要的是可以将来自于基本表(或者其他视图)的数据混合以及匹配,以创建在大多数方面上像另一个基本表那样起作用的对象。你可以创建一个简单的查询,仅仅从一个表中选择一些列,而忽略其他列;或者你可以创建一个复杂的查询,以连接一些表,使得这些表看起来像一个表。

7.1 简单的视图 视图语法的最基本形式 CREATE VIEW AS

任务一、创建简单的视图 该视图称为学生电话列表,并且创建为在StuScores数据库里的StudentPhoneList_vw. 步骤: 1、输入下列代码,运行 USE StuScores GO CREATE VIEW StudentPhoneList_vw AS SELECT StudentName, ContactPhone FROM Students

2、运行下列代码,试着比较结果 SELECT * FROM StudentPhoneList_vw SELECT * FROM Students

3、示例说明 得到的结果看起来几乎是相同的——实际上,在共有的列里,两个结果集是同样的。视图没有真正改变任何内容,只不过是“通过”所访问的数据的筛选版本。对此,好的方面是已经减少了终端用户的复杂性。但是,在请求的数据和所交付的数据之间增加了额外的一层系统开销。视图起到过滤数据的作用,对于用户而言是安全的或者是简单的。

任务二、创建复杂的视图 这里对更加复杂的视图所做的实际上只是添加连接、概要、以及可能的一些列的重新命名。视图的一个最普通的用途是平滑数据,举例,为管理提供一个视图以便更加容易地检查销售信息,管理者希望执行简单的查询以了解订购了哪些订单,是订购了哪些零件的,以及是谁订购的。所以使用Northwind数据库,创建一个他们能在其上执行非常简单的查询的视图。 2 / 7

步骤: 1、输入下列代码,运行 USE Northwind GO CREATE VIEW CustomerOrders_vw AS SELECT cu.CompanyName, o.OrderID, o.OrderDate, od.ProductID, p.ProductName, od.Quantity, od.UnitPrice, od.Quantity * od.UnitPrice AS ExtendedPrice FROM Customers AS cu INNER JOIN Orders AS o ON cu.CustomerID = o.CustomerID INNER JOIN [Order Details] AS od ON o.OrderID = od.OrderID INNER JOIN Products AS p ON od.ProductID = p.ProductID

2、现在运行一个SELECT 语句: SELECT * FROM CustomerOrders_vw 这样得到一些行——超过2000个——但是还得到对于普通的管理者来说更容易理解和区分的信息。

3、再运行一个SELECT 语句: SELECT CompanyName, ExtendedPrice FROM CustomerOrders_vw WHERE OrderDate = '9/3/1996' 用户不需要知道怎样执行一个四个表的连接——那是隐藏于视图中的。代替的是,他们只需要有限的技巧以完成这个工作。 4、还可以进一步使得查询更加具有目的性。比如,仅仅想要视图返回昨天的销售情况。只对查询做很小的改变: USE Northwind GO CREATE VIEW YesterdaysOrders_vw AS SELECT cu.CompanyName, o.OrderID, o.OrderDate, od.ProductID, 3 / 7

p.ProductName, od.Quantity, od.UnitPrice, od.Quantity * od.UnitPrice AS ExtendedPrice FROM Customers AS cu INNER JOIN Orders AS o ON cu.CustomerID = o.CustomerID INNER JOIN [Order Details] AS od ON o.OrderID = od.OrderID INNER JOIN Products AS p ON od.ProductID = p.ProductID WHERE CONVERT(varchar(12),o.OrderDate,101) = CONVERT(varchar(12),DATEADD(day,-1,GETDATE()),101) 注意最后的两行代码。 同时因为在Northwind数据库中的所有日期都是太久远以至于这个视图不会返回任何数据,所以添加一行来测试一下。

5、将下列的所有脚本执行一次: USE Northwind DECLARE @Ident int INSERT INTO Orders (CustomerID,OrderDate) VALUES ('ALFKI', DATEADD(day,-1,GETDATE())) SELECT @Ident = @@IDENTITY INSERT INTO [Order Details] (OrderID, ProductID, UnitPrice, Quantity) VALUES (@Ident, 1, 50, 25) SELECT 'The OrderID of the INSERTed row is ' + CONVERT(varchar(8),@Ident) 我们已经对脚本和批处理有了初步的印象,目前,只是要确信你需要依次执行所有的脚本,这样在Northwind中得到一个值,这个值将出现在视图中。 OrderID可能是变化的,但是其他的应当保持不变。

6、现在对视图执行一个查询来查看得到的结果: SELECT CompanyName, OrderID, OrderDate FROM YesterdaysOrders_vw

7、自学DATEADD和CONVERT函数 任务三、约束插入到视图中的内容——WITH CHECK OPTION WITH CHECK OPTION规则很简单——为了通过使用视图更新或者插入数据,结果行必须符合要求以出现在视图结果中,即插入或者更新的行必须满足视图中SELECT语句的WHERE准则。 4 / 7

步骤: 1、继续以Northwind数据库为例,创建只显示特定区域发货人的视图。利用区号以计算出发货人来自何处。 CREATE VIEW OregonShippers_vw AS SELECT ShipperID, CompanyName, Phone FROM Shippers WHERE Phone LIKE '(503)%' OR Phone LIKE '(541)%' OR Phone LIKE '(971)%' WITH CHECK OPTION

2、执行SELECT 语句 SELECT * FROM OregonShippers

3、现在尝试通过使用视图来更新某一行——设置不是以(503)、(541)或者(971)开头的电话号码值。 UPDATE OregonShippers_vw SET Phone = '(333) 555 9831' WHERE ShipperID = 1 分析结果 4、示例说明 WHERE子句过滤视图中的内容只是(503)、(541)或者(971)的区号,并且WITH CHECK OPTION说明任何INSERT 或者UPDATE语句必须满足WHERE子句准则(而(333)区号不满足这个准则)。 因为更新不满足WHERE子句准则,所以被丢弃了;但是,如果将行插入到基表中,则会顺利完成。 5、执行下列代码: UPDATE Shippers SET Phone = '(333) 555 9831' WHERE ShipperID = 1 分析结果,可以看出限制仅仅应用于视图中,没有应用于内在的表。 6、对于INSERT操作,也是同样的结果,尝试执行下列代码并分析结果: INSERT INTO OregonShippers_vw VALUES ('My Freight Inc.', '(555) 555-5555')

任务四、更多的对视图的操作 步骤: 1、尝试使用ALTER VIEW修改视图 2、尝试使用 DROP VIEW 删除视图 5 / 7

3、尝试在Management Studio中创建和编辑视图 4、显示现存的视图代码,使用sp_helpext系统函数,下列代码对Northwind数据库中的一个名为[Alphabetical list of products]的视图执行文本显示。 EXEC sp_helptext [Alphabetical list of products]

任务五、保护代码:加密视图 加密视图使用WITH ENCRYPTION选项。WITH ENCRYPTION跟在视图的名字之后,但是在AS关键字之前。另外,如果使用了ALTER VIEW语句,那么除了访问权限外,你完全更换了现存的视图。这意味着密码也被替换了。如果想对被改变的视图加密,那么必须在ALTER VIEW语句中使用WITH ENCRYPTION子句。 在Northwind中创建的CustomerOrders_vw视图上执行ALTER VIEW。如果你还没有创建该视图,那么只需将ALTER 改为CREATE。 步骤: 1、运行下列代码,注意ALTER 该为CREATE: USE Northwind GO

ALTER VIEW CustomerOrders_vw WITH ENCRYPTION AS SELECT cu.CompanyName, o.OrderDate, od.ProductID, p.ProductName, od.Quantity, od.UnitPrice, od.Quantity * od.UnitPrice AS ExtendedPrice FROM Customers AS cu INNER JOIN Orders AS o ON cu.CustomerID = o.CustomerID INNER JOIN [Order Details] AS od ON o.OrderID = od.OrderID INNER JOIN Products AS p ON od.ProductID = p.ProductID 2、在CustomerOrders_vw上执行sp_helptext: EXEC sp_helptext CustomerOrders_vw 分析结果 SQL Server认识到这是一个加密的视图,所以你的代码是安全和可靠的。 注意: 1. 确信在使用WITH ENCRYPTION选项之前,你在某处存储了源代码。一旦源代码被加密了,就没有办法恢复。如果你没有在其他地方存储代码并且需要改变代码,那么你会发现需要从零开始重写。 3、尝试修改加密的视图 4、尝试删除加密的视图