2009-10-31 102 views

回答

38

Oracle中的視圖可能在特定條件下可更新。這可能會非常棘手,通常不建議使用

Oracle 10g SQL Reference

注意事項可更新視圖

更新視圖是一個可以用來插入,更新或刪除基錶行。您可以創建一個視圖以固有更新,或者您可以在任何視圖上創建INSTEAD OF觸發器以使其可更新。

要了解是否以及如何修改固有可更新視圖的列,請查詢USER_UPDATABLE_COLUMNS數據字典視圖。此視圖顯示的信息僅對固有可更新的視圖有意義。爲了本質上更新視圖,必須滿足以下條件:

  • 視圖中的每一列必須映射到單個表的列。例如,如果一個視圖列映射到一個TABLE子句的輸出(一個非內置集合),那麼這個視圖並不是固有的可更新的。
  • 視圖必須不包含任何下列構建體:
    • 一組操作者
    • DISTINCT運算符
    • 一個聚集或解析函數
    • 甲GROUP BY,ORDER BY,MODEL,CONNECT BY或WITH子句
    • START在SELECT列表
    • 在SELECT列表中的子查詢的集合表達
    • WITH READ指定的子查詢ONLY
    • 加入,也有一些例外,如Oracle數據庫管理員指南

此外中記錄,如果固有可更新視圖包含僞列或表達式,那麼你就不能更新基地使用引用任何這些僞列或表達式的UPDATE語句的錶行。

如果你想連接視圖是可更新的,那麼所有的以下條件必須爲真:

  • 的DML語句必須影響只有一個表背後的加入。
  • 對於INSERT語句,不得使用WITH CHECK OPTION創建視圖,並且插入值的所有列必須來自保存鍵的表。保存鍵的表格是基表中的每個主鍵或唯一鍵值在連接視圖中都是唯一的。
  • 對於UPDATE語句,所有更新的列必須從保存鍵的表中提取。如果視圖是使用WITH CHECK OPTION創建的,那麼連接從視圖中多次引用的表中獲取的列和列必須從UPDATE屏蔽。
  • 對於DELETE語句,如果連接生成多個保留鍵的表,那麼Oracle數據庫將從FROM子句中指定的第一個表中刪除該視圖是否已創建WITH CHECK OPTION。
3

有兩個時候,你可以通過視圖更新記錄:

  1. 如果視圖沒有加入或過程調用,並從一個底層表中選擇數據。
  2. 如果視圖有與視圖關聯的INSTEAD OF INSERT trigger

一般來說,除非您專門爲它編寫了INSTEAD OF觸發器,否則不應該依賴於能夠對視圖執行插入操作。請注意,INSTEAD OF UPDATE觸發器也可以寫入以幫助執行更新。

+2

大部分都是如此,但在某些情況下可以更新連接視圖。 – DCookie 2009-10-31 02:20:18

9

甲骨文使視圖都可以更新的兩種不同的方式: -

  1. 的觀點是「重點保障」相對於您要更新什麼。這意味着基礎表的主鍵在視圖中,並且該行在視圖中只出現一次。這意味着Oracle可以確切地確定要更新哪個基礎錶行。或者您可以編寫而不是觸發器。

我會遠離代替觸發器,並讓您的代碼直接更新底層表而不是通過視圖。

+0

在這兩個條件之間是否有'and'或者'or'? (對我來說,這聽起來像兩個獨立的想法.. – Thorsten 2009-11-01 21:28:17

+0

它是或者。 – DCookie 2009-11-02 14:50:04

0

YES,您可以更新和插入到視圖和編輯將反映在原始表 ....

1 - 視圖所應有的一切NOT NULL表上的值
2-更新應該有與表相同的規則......「更新與其他外鍵相關的主鍵......等等......」

相關問題