建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 数据库 > MSSQL Server教程 >

详说Sql Server中的视图

时间:2009-06-19 22:57来源: 作者: 点击:
视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询。视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目标。当然,当你修改视图的时候,修改的时候是对基础表的修改,它就好像是一个代理。当然,如果不允许直接修改基础表,只允许修改视图,就可
  • 什么是视图?
  • 视图中的ORDER BY;
  • 刷新视图;
  • 更新视图;
  • 视图选项;
  • 索引视图;
  •      细说Sql Server中的视图(上)

    4.更新视图

    视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询。视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目标。当然,当你修改视图的时候,修改的时候是对基础表的修改,它就好像是一个代理。当然,如果不允许直接修改基础表,只允许修改视图,就可以限制你要公开的数据。这样,就可以对你的数据起到一定的保护作用,不过这种限制的时候很少。

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

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

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

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

        4,如果在创建或修改视图时指定了WITH CHECK OPTION选项,与视图的查询筛选器有冲突的INSERT或UPDATE语句将被拒绝;我在“视图选项”一节详细讲解一下。

       如果视图上定义了INSERT OF触发器,则违反这些限制的数据修改语句可以被执行。在INSERT OF触发器中你可以用自己的代码替换原始修改;

       当你允许对有联结查询定义的视图执行修改的时候,一定要谨慎,比如一对多的关系,如果你根据“多”的某一索引值修改对应“一”端某列值的记录,那么结果就可想而知;

    5.视图选项

       当你创建或修改视图时,可以指定一些选项,这些选项用户控制视图的行为和功能。

       ENCRYPTION、SCHEMABINDING和VIEW_METADATA选项在视图头指定,CHECK OPTION选项则在查询之后指定;

       如:        

       1:  CREATE VIEW v2
       2:  WITH ENCRYPTION,SCHEMABINDING,VIEW_METADATA
       3:  AS
       4:  SELECT OrderID FROM dbo.Orders
       5:  WITH CHECK OPTION

        1),ENCRYPTION

    如果你在构建任何类型的商业软件的时候,需要对视图进行加密的时候,这是一个不错的选项。

    如果未指定ENCRYPTION选项,SQLSERVEr则以纯文本的形式保存用户定义的语句,如果指定了ENCRYPTION选项,对象的文本则会被混淆。

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

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

        2),SCHEMABINDING

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

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

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

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

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

        3),CHECK OPTION

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

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

       1:  CREATE VIEW CustomerWithOrder
       2:  WITH VIEW_METADATA
       3:  AS
       4:   
       5:  SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 
       6:  WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID)
       7:   
     该视图的作用是查询所有有订单的客户的id和公司名,接下来我们向视图中插入一条不存在的用户id,和公司名:
       1:  INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('MYSQL','MyReed')
    执行成功,然后在查询这个CustomerWithOrder视图,很明显,查询不到CustomerID为’MySQL’的用户,因为视图只包含发生过订单的用户;如果你直接查询Customers表,就会发现这个新增的用户信息了。
    接下来对CustomerWithOrder视图添加WITH CHECK OPTION 选项
       1:  ALTER VIEW CustomerWithOrder
       2:  WITH VIEW_METADATA
       3:  AS
       4:   
       5:  SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 
       6:  WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID)
       7:   
       8:  WITH CHECK OPTION

    然后再执行下面的语句:

       1:  INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('ILSQL','MyReed')

    你会收到以下错误:

    Msg 550, Level 16, State 1, Line 2
    试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
    语句已终止。 

    (责任编辑:admin)

    织梦二维码生成器
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线----------------------------
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    用户名: 验证码:点击我更换图片