2009-09-02 73 views

回答

8

有幾個不同的場景我見過

1)你建立一個系統的初始數據模型和查詢中僅有1提供一組視圖方面的應用:1映射與表。將來,如果您決定需要更改數據模型並將一個表分成兩個不同的表,則可以通過保持視圖圖層不變來實現,而不會影響任何現有的應用程序。但爲了讓事情對應用程序保持透明,您必須繼續允許在視圖上插入插入兩個(或多個)不同表的插入,您需要INSTEAD OF觸發器。

2)#1上的變體,您的應用程序剛開始時只是直接點擊表格。如果要重構表格定義而不影響現有應用程序,請重命名錶格(T變爲T_OLD),創建新表格,並使用INSTEAD OF觸發器創建名爲T的視圖。這具有相同的效果 - 它允許您更改表格聲明而無需更改應用程序。

2

docs表示他們要修改視圖。

因此,如果您創建的視圖是兩個表的JOIN,並且您試圖在VIEW上執行INSERT語句,則可以編寫一個INSTEAD OF觸發器,以相應地修改這兩個基礎表。

4

賈斯汀有nailed the two main cases但有一些其他用途。

一個是在表中包含其數據的歷史軌跡以及當前版本。在這裏,我們希望通過INSTEAD OF UPDATE觸發器在表上構建一個視圖(例如控制顯示哪個版本),該觸發器將當前記錄更新爲舊的,然後將更改作爲插入應用,從而創建新的當前記錄。這個主題有各種各樣的變化。例如,我們可以通過使用INSTEAD OF DELETE觸發器執行更新(設置DELETED_FLAG列)來實施邏輯刪除策略。

另一種情況是,當應用程序需要我們保持一些數據的兩個副本 - 主表和本地表。我們將使用可更新視圖從適當的表中選擇一個INSTEAD OF觸發器來決定將DML應用於哪個表。

這些不是如何設計一個好的,健全的數據模型的光輝事例。但他們是我們偶爾發現自己不得不實施的那種詭計。

+0

感謝您抽出時間來回答我的問題APC。 – caddis 2009-09-03 20:58:58

2

另一種模式,這是我見過的非常成功的,是當應用程序架構想要從前端隔離數據庫設計。他們希望在數據庫方面做到這一點,而不是通過對象關係框架。

例如,如果你想使前端開發人員的工作很容易,你可以建立每個前端頁面視圖(或一組頁)。然後使用替代觸發器來處理映射回基礎表。

當然,它有助於讓堅實的數據庫開發人員瞭解Oracle如何工作。

+0

謝謝吉姆分享這種使用而非觸發器。 – caddis 2009-09-03 21:01:50