MsSQL   发布时间:2022-05-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQLServer 的视图大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

(1)视图的定义:

           视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有物理表现形式,除非你为其创建一个索引;假如查询一个没有索引的视图,sql Server实际访问的是基础表。

          视图在我们日常操作也扮演着许多重要的角色,比如可以利用视图访问经过筛选和处理的数据,而不是直接访问基础表,以及在一定程度上也保护了基础表。

(2)视图的创建:

         我们在创建视图的时候,也要遵守三个规则:

  A :不能在视图定义中指定ORDER BY ,除非定义中包含Top或For Xml 说明。这是因为视图被认为是一个表,表是一个逻辑的实体,它的行是没有顺序的。

  B:所有的列必须有列名;

  C:这些所有的列名必须唯一;

         创建实例:

CREATE VIEW dbo.V1
AS
SELECT CustomerID,CompanyName FROM Customers 
WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID)

        假如我们在上面的创建的sql语句中加一个Order BY 语句,看看有什么效果:


ALTER VIEW dbo.V1
AS 
SELECT CustomerID,CompanyName FROM Customers 
WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 
ORDER BY CompanyName

         运行该语句将会失败,收到以下的提示:

       Msg 1033,Level 15,State 1,Procedure V1,Line 5

  除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

       根据提示,ORDER By 也不是不能用,只有指定了Top或for xml语句后,ORDER BY 才能使用,如:

ALTER VIEW dbo.V1
AS 
SELECT TOP(10) CustomerID,CompanyName FROM Customers 
WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 
ORDER BY CompanyName

       但是,并不建议在视图中使用ORDER BY,这是因为视图表示一个表,而对于表来说,是不会有排序的;所以建议在查询视图的时候,用ORDER BY;

(3)视图的刷新:

        视图会保存元数据,列,安全,以及依靠等信息,假如我们把基础表的架构更改了,并不会直接反映到视图上来;更改架构后,使用sp_refreshview存储过程:EXEC sp_refreshview ViewName 刷新视图的元数据是一个好习惯。

(4)视图的更新:

       在更新视图的时候,有哪些限制条件呢?

     A:只要视图有一列不能隐式获取值,你就不能想视图中插入数据,假如列答应NULL、有默认值或者IDETITY属性,则说明它可以隐式获取值;

    B:假如视图包含联结,UPDATE或INSERT语句只能影响联结的一端。也就是说,INSERT或UPDATE语句必须定义目标列列表,这些列只能数据联结的一端。你不能从由联结查询定义的视图中删除数据;

     C:不能修改作为计算结果的列。如:标量表达式和聚合函数,sqlServer不会尝试改变数据库引擎的计算结果;

    D:假如在创建或修改视图时指定了WITH CHECK OPTION选项,与视图的查询筛选器有冲突的INSERT或UPDATE语句将被拒绝;假如视图上定义了INSERT OF触发器,则违反这些限制的数据修改语句可以被执行。在INSERT OF触发器中你可以用自己的代码替换原始修改;当你答应对有联结查询定义的视图执行修改的时候,一定要谨慎,比如一对多的关系,假如你根据“多”的某一索引值修改对应“一”端某列值的记录,那么结果就可想而知;

    E:视图选项。当你创建或修改视图时,可以指定一些选项,这些选项用户控制视图的行为和功能。ENCRYPTION、SCHEMABINDING和VIEW_MetaDATA选项在视图头指定,CHECK OPTION选项则在查询之后指定;

如:

CREATE VIEW v2
WITH ENCRYPTION,SCHEMABINDING,VIEW_MetaDATA
AS
SELECT OrderID FROM dbo.Orders
WITH CHECK OPTION

              A1: ENCRYPTION

              假如你在构建任何类型的商业软件的时候,需要对视图进行加密的时候,这是一个不错的选项。假如未指定ENCRYPTION选项,sqlSERVEr则以纯文本的形式保存用户定义的语句,假如指定了ENCRYPTION选项,对象的文本则会被混淆。

              sqlSERVER提供了一个系统函数sp_helptext查看视图的文本,假如应用的ENCRYPTION选项,则会得到“The text for object ‘xx’ is encrypted”语句;

               注:在加密之前一定要先备份你所要加密的视图,一旦加密,就不能回头。

              B2: SCHEMABINDING

        假如你使用SCHEMABINDING选项创建视图,sqlSERVER将不答应删除基础表或修改被引用的列,防止在对底层对象修改时,使视图变得“孤立”,假如某人没有注重到你的视图,执行了DROP,删除视图引用的列或其他一些操作,那就很糟糕。假如使用SCHEMABINDING选项,则就可以避免这种情况。

        假如想在视图上创建索引,则必须使用SCHMABINDING选项;

        假如应用这个选项,则定义视图的时候要注重两点:

         * 1: 所有对象必须由两部分构成的名称,如:应该使用dbo.Orders 而不能是Orders

        * 2: 不能在SELECT列表使用*,所有的列名必须指定一个名称;

              C3: CHECK OPTION

         使用WITH CHECK OPTION 创建的视图能防止与视图查询筛选器有冲突的INSERT或UPDATE语句。没有该选项,视图可以接受不符合查询筛选器的修改。比如:

             我们在northwind数据库中创建一个CustomWithOrder的视图,现在还没有添加WITH CHECK OPTION选项

CREATE VIEW CustomerWithOrder
WITH VIEW_MetaDATA
AS
SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 
WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID)

          该视图的作用是查询所有有订单的客户的id和公司名,接下来我们向视图中插入一条不存在的用户id,和公司名:

INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('MysqL','MyReed')

              执行成功,然后在查询这个CustomerWithOrder视图,很明显,查询不到CustomerID为’MysqL’的用户,因为视图只包含发生过订单的用户;假如你直接查询Customers表,就会发现这个新增的用户信息了。

             接下来对CustomerWithOrder视图添加WITH CHECK OPTION 选项

ALTER VIEW CustomerWithOrder
WITH VIEW_MetaDATA
AS
SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 
WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID)
WITH CHECK OPTION

               然后再执行下面的语句:

INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('ILsql','MyReed')

            你会收到以下错误:

        Msg 550,Level 16,Line 2

          试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。

         语句已终止。

               D4 :VIEW_MetaDATA

         该选项的作用是,让视图看起来更像一个真正的表。不使用该选项,返回给客户端的api的元数据将是视图所依靠的基础表的数据;

              假设用户拥有对视图的操作权限,而没有对基础表操作的权限,那么用户对视图执行一些操作,假如指定了VIEW_MetaDATA选项,那么该语句将会违反安全而失败,因为只要指定了VIEW_MetaDATA那么返回给客户端就是视图的元数据,而不是基础表的元数据。另一方面,假如用户尝试通过视图修改数据,而该操作又与视图上定义的CHECK OPTION有冲突,这种操作只有直接提交到基础表,才有可能成功。

             只要有VIEW_MetaDATA选项就有必要加上CHECK OPTION选项,而SCHEMABINDING选项,最好也要加上,防止你的视图“孤立”,而在索引视图中SCHEMABINDING选项是必须加上的。

(5)视图的索引

  假如没有索引,视图中的数据不会有任何物理表现形似,假如加上索引,则就把视图中的数据物理化了,sqlServer会在修改基础表时同步索引视图。但你不能直接同步视图内容。

  我们知道在表上创建索引,能提高性能,相同,在视图也是一样,在视图上创建的第一个索引必须是唯一聚集索引,之后才可以创建其他的非聚集索引。

  索引视图必须使用SCHEMABINDING选项,并且不能引用其他视图,只能引用基础表和UDF,而基础表和UDF必须使用两部分命名约定来引用

  除了性能,你可能还会因为其他原因使用索引视图,比如在一张基础表中有一列我们要强制该列中已知值的唯一性,但是答应出现多次的NULL值,我们怎么办呢,我们首先想到的可能是用UNIQUE约束,但是UNIQUE会认为两个NULL值相等,那么这个不得不放弃了,那还有什么办法呢?

  其实我们可以利用一个索引视图来完成这个任务,利用索引视图筛选所有非NULL的数据,那么这种索引将防止重复的已知值进入基础表,但答应多个NULL,因为NULL不是唯一索引的一部分,我们在向基础表中插入数据的时候,就利用索引视图的UNIQUE来限制我们的数据,来达到某列中强制已知值的唯一性的目的;

大佬总结

以上是大佬教程为你收集整理的SQLServer 的视图全部内容,希望文章能够帮你解决SQLServer 的视图所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: