[朝花夕拾]可更新視圖

可更新視圖


1.視圖概述

  
 視圖是從一個或多個基表(或視圖)導出的表。通常視圖僅僅是一個虛表,即數據庫中只存放視圖的定義信息等元數據,而不存放視圖對應的數據。 視圖上的操作和基表類似,但是 DBMS對視圖的更新操作(INSERT、DELETE、UPDATE)往往存在一定的限制。 DBMS對視圖進行的權限管理和基表也有所不同。
   
  
視圖可以提高數據的邏輯獨立性,也可以增加一定的安全性。 DBMS在處理視圖時和基表存在很多不同的地方,例如:

  • 定義:基於基表或視圖
  • 數據:一般不單獨存放
  • 查詢:允許,和基表類似
  • 插入:有限制
  • 刪除:有限制
  • 更新:有限制
  • 權限:有所不同

  本文主要討論視圖的可更新性,即考慮視圖上的更新類操作存在哪些特點和限制。

2.SQL92定義的可更新視圖

  若一個視圖是從單個的基表導出的,並且只是去掉了基表的某些行和列,且保留了基表的主碼,這樣的視圖被稱爲行列子集視圖。SQL92中對可更新視圖的支持非常有限,主要就是上述的行列子集視圖。 SQL92中對可更新視圖的要求如下:

  1. 視圖定義必須是一個簡單的SELECT語句,不能帶連接、集合操作。即SELECT語句的FROM子句中不能出現多個表,也不能有 JOIN、EXCEPT、UNION、INTERSECT
  2. 視圖定義的 SELECT子句中不能有DISTINCT
  3. SELECT子句中的各列必須來自於基表(視圖)的列,不能是表達式
  4. 視圖所基於的基表(或視圖)必須是可更新的
  5. 視圖定義的 SELECT子句的子查詢的FROM子句不能有視圖所基於的基表(或視圖)
  6. 視圖定義的 SELECT語句中不能含有GROUP BY子句
  7. 視圖定義的 SELECT語句中不能含有HAVING子句

  根據SQL92的定義,一個視圖要麼是可更新的,要麼是不可更新的,二者必居其一。SQL92 也不允許視圖中某些列可以更新,某些列不可以更新。

3.SQL99(SQL3)定義的可更新視圖

  SQL99放寬了對可更新視圖的限制,甚至還區分了視圖是否可插入、列是否可 LL、連接查詢生成的視圖可更新。

4.主流 DBMS對可更新視圖的支持

 (1)MS SQL Server 2000

  SQL Server 2000 除了支持SQL標準規定的可更新視圖,還提供了兩種擴充:

  1. INSTEAD OF 觸發器 
    在視圖上創建這種類型的觸發器,可以間接地實現對基表的更新。
  2. 某些分區視圖是可更新的

  對於不具備上述兩種特性的視圖, SQL Server 遵照SQL標準的規定做了如下限制:

  1. SELECT語句的結果列中沒有聚集函數,SELECT子句中沒有TOP, GROUPBY, UNION,DISTINCT 子句
    這裏沒有提到 INTERSECT, EXCEPT,是因爲SQL Server不支持。
  2. SELECT語句的結果列中沒有導出列。即只能有列名。
  3. SELECT語句的FROM字句至少有一個表(或視圖)。 
    因爲 SQL Server支持不帶FROM子句的SELECT語句。例如:

    CREATE VIEW NoTable AS
      SELECT GETDATE() AS CurrentDate, 
      @@LANGUAGE AS CurrentLanguage, 
      CURRENT_USER AS CurrentUser;

    SELECT CURRENT_USER;

  4. UPDATE和INSERT,如果修改的數據僅涉及視圖所基於的一個基表,則可更新。DELETE則只能用於基於單個基表的視圖。
  5. 分區視圖其實是用 UNION ALL聯合兩個或多個SELECT語句定義的視圖。 

    SELECT
    基表的所有列必須都在 SELECT的結果列中。
    各個 SELECT語句的結果列對應的列是同一類型和COLLATION。
    結果列中至少有一列上定義了簡單的 CHECK約束,保證該列取某個具體值的時候,要麼不滿足所有表的CHECK約束,要麼滿足其中一個表上的CHECK約束。即這些CHECK定義的值域是互不重疊的。
    這樣的列被成爲分區列。表上的約束必須是打開的。
    表中的一個列最多在結果列中出現一次。

    PARTITIONED COLUMN
    分區列是主碼的一部分。
    分區列不能是computed column。
    該列上只能有1個約束。

    MEMBER TABLES

    表可以是本數據庫中的,也可以是其他數據庫中的,也可以是通過 OPENDATASOURCE 或 OPENROWSET-based引用的。
    同一個表只能在 CREATE VIEW語句中出現一次。
    不能在compute column上建有索引。
    表的主碼必須類似(建在同樣的列上)。
    所有表的 ANSI padding設置一致。

    其他關於分佈式分區表的限制

 (2)ORACLE 8i/9i

  ORACLE允許用“WITH READ ONLY”子句顯式地指定視圖是隻讀的。若視圖不帶上述子句,則ORACLE遵照SQL標準提出了以下限制:

  1. 不能有集合操作(UNION,UNION ALL,INTERSECT,MINUS)
  2. 不能有DISTINCT
  3. 不能有聚集函數(AVG,COUNT,MAX,MIN等)和分析函數
  4. 不能有GROUP BY,ORDER BY,CONNECT BY,START WITH
  5. SELECT列表中不能出現collection expression
  6. SELECT列表中不能有子查詢
  7. 一般不能是JOIN查詢(參見i)
  8. SELECT列表中若出現系統的僞列或表達式,則更新語句不能修改這些列
  9. 可更新的連接視圖要滿足一些額外的條件
    簡單的說,視圖定義中用到的基本表必須是“鍵值保持表”。(A base table of a view is considered a key-preserved table if every primary-key or unique-key value in the base table is also unique in the result set of the join view—in other words, if the entity integrity of the base table is preserved by the join view. )

  我們還可以用INSTEAD OF 觸發器來實現視圖的更新。詳細的信息還請參考文獻[7]。

(3)DB2V8

  DB2將視圖區分爲可刪除視圖、可更新視圖、可插入視圖、只讀視圖、不可用視圖等。這樣的劃分應該更爲合理,也比較好理解。DB2的可更新視圖:

  1. 允許更新某些UNION ALL視圖
  2. 不允許更新象ORACLE支持的連接查詢視圖

  也可以用INSTEAD OF 觸發器來實現視圖的更新操作。詳細的信息還請參考文獻[8]。

  主要的幾個 DBMS 都實現了 SQL92 定義的可更新視圖,SQL99 定義的可更新視圖也或多或少的得到了支持。但是需要注意的是,產品之間對可更新視圖的實現程度是有差異的,而且由於它們支持的SQL語法存在一些差異,要書寫可移植的 SQL 語句需要特別注意。

5.可更新視圖的進一步探討

  E.F.Codd提出了評價全關係系統的12條準則。其中的準則6就是討論視圖的更新的。準則6的內容如下:
    準則6:視圖更新準則。所有理論上可以更新的視圖也應該允許由系統更新。 
  
理論上可以更新的視圖指的是對視圖的更新要求,存在一個與時間無關的算法,可以無二義性地把更新要求轉換爲對基表的更新序列。視圖更新準則對於系統對數據的邏輯獨立性支持是非常重要的。
  
  
C. J. Date在文獻[2]和他的很多技術文章中對SQL標準定義的可更新視圖提出了批評,並提出了自己的一系列觀點。他的基本觀點是所有的視圖本質都是可以更新的,只是某些時候要受制於完整性約束。這是一種比較美妙的境界,實際的 DBMS產品當然還不可能做到這樣完美。

參考文獻:

1.薩師煊、王珊,數據庫系統概論(第三版),高等教育出版社,2000
2.C. J. Date,An Introduction to Database Systems (Seventh Edition),機械工業出版社,2002
3.SQL92, ANSI/ISO/IEC 9075:1992
4.SQL99, ANSI/ISO/IEC 9075-2:1999
5.Peter Gulutzan, Trudy Pelzer, 齊舒創作室譯, SQL-3 參考大全, 機械工業出版社,2001
6.Microsoft, http://msdn.microsoft.com, SQL Server 2000 Online Book
7.Oracle, http://otn.oracle.com, Oracle 9i SQL Reference
8.IBM, http://www.ibm.com, IBM DB2 Universal Database SQL Reference Volume 2
9.http://www.oracle.com/oramag/oracle/01-mar/index.html?o21o8i.html
10.http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0210rielau/0210rielau.shtml


發佈了94 篇原創文章 · 獲贊 9 · 訪問量 309萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章