熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

SQL實戰新手入門:可更新的視圖(2)

2013-11-13 12:43:31  來源: SQL語言 

   可更新的視圖(

  示例說明

  在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都支持使用它包括OracleMySQLMicrosoft SQL Server和IBM DB

       返回目錄SQL實戰新手入門

       編輯推薦

       Oracle索引技術

       高性能MySQL

       數據倉庫與數據挖掘培訓視頻教程


From:http://tw.wingwit.com/Article/program/SQL/201311/16458.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.