您现在的位置是:首页 >

哪些视图不能更新 SQL实战新手入门:可更新的视图(2)

火烧 2021-09-08 05:25:18 1055
SQL实战新手入门:可更新的视图(2)    可更新的视图( )  示例说明  在BOOKS表中 除了BK_ID列被定义为主键列之外 其他所有列都允许NULL值 上面例子中创建的vwBookPrice

SQL实战新手入门:可更新的视图(2)  

   可更新的视图( )

  示例说明

  在BOOKS表中 除了BK_ID列被定义为主键列之外 其他所有列都允许NULL值 上面例子中创建的vwBookPrices视图是基于单个表的(BOOKS表) 它允许更新BK_TITLE列和BK_PRICE列 并允许插入新记录 该视图还支持删除记录 实际上 如果不是由于参照完整性的限制 不允许在最子层表中出现 孤立 记录 我们将可以通过视图删除BOOKS表中的所有记录

  WITH CHECK OPTION

  通过视图添加 修改和删除数据的功能也带来了新的问题 对于通过视图插入的数据与通过视图显示出来的数据 如何才能确保两者之间的一致性呢?

  假设在前面的练习中 当创建视图时添加了一个约束条件 将视图限制为只显示BK_ID小于或等于 的图书

  CREATE VIEW vwBookPricesFirst

  AS SELECT

  bk_id

   bk_title

   bk_price

  FROM books

  WHERE bk_id <=

  尽管如此 只需要采用与上面的练习中非常类似的步骤就可以通过视图插入新记录 例如插入一条BK_ID= 的新记录 没有任何东西阻止这种插入操作 这时通过视图查看记录的结果就会不同 因为该视图定义了只显示BK_ID <= 的记录

  除非读者故意要实现这样的功能 否则很可能希望看到通过视图插入到表中的数据 或者首先阻止无效的数据通过视图插入到表中 要实现这样的功能 请使用CHECK OPTION

  只需要将WITH CHECK OPTION添加到视图的定义中 当想插入视图无法显示的数据时 该语句将抛出一个异常 下面是Microsoft SQL Server对此作出的反应

  CREATE VIEW vwBookPricesFirst

  AS SELECT

  bk_id

   bk_title

   bk_price

  FROM books

  WHERE bk_id <=

  WITH CHECK OPTION;

  INSERT INTO vwBookPricesFirst (bk_id) VALUES ( )

  Msg Level State Line

  The attempted insert or update failed because the target view either

  specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION

  and one or more rows resulting from the operation did not qualify under

  the CHECK OPTION constraint

  The statement has been terminated

  请注意 这对于直接更新BOOKS表中的数据并没有任何影响 它只是对视图施加了限制 因为该视图无法显示BK_ID大于 的记录

  在入口处检查数据将带来严重的性能损失 因此应该谨慎使用

  CHECK OPTION是SQL标准的一部分 所有具有可更新视图功能的RDBMS都支持使用它 包括Oracle MySQL Microsoft SQL Server和IBM DB

      返回目录SQL实战新手入门

      编辑推荐

       Oracle索引技术

       高性能MySQL

哪些视图不能更新 SQL实战新手入门:可更新的视图(2)
lishixinzhi/Article/program/SQL/201311/16458  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码