有沒有人有一個簡單的例子,解釋了爲什麼人會願意使用Oracle instead of trigger?的Oracle實例「而不是」觸發
回答
有幾個不同的場景我見過
1)你建立一個系統的初始數據模型和查詢中僅有1提供一組視圖方面的應用:1映射與表。將來,如果您決定需要更改數據模型並將一個表分成兩個不同的表,則可以通過保持視圖圖層不變來實現,而不會影響任何現有的應用程序。但爲了讓事情對應用程序保持透明,您必須繼續允許在視圖上插入插入兩個(或多個)不同表的插入,您需要INSTEAD OF觸發器。
2)#1上的變體,您的應用程序剛開始時只是直接點擊表格。如果要重構表格定義而不影響現有應用程序,請重命名錶格(T變爲T_OLD),創建新表格,並使用INSTEAD OF觸發器創建名爲T的視圖。這具有相同的效果 - 它允許您更改表格聲明而無需更改應用程序。
docs表示他們要修改視圖。
因此,如果您創建的視圖是兩個表的JOIN,並且您試圖在VIEW上執行INSERT語句,則可以編寫一個INSTEAD OF觸發器,以相應地修改這兩個基礎表。
賈斯汀有nailed the two main cases但有一些其他用途。
一個是在表中包含其數據的歷史軌跡以及當前版本。在這裏,我們希望通過INSTEAD OF UPDATE觸發器在表上構建一個視圖(例如控制顯示哪個版本),該觸發器將當前記錄更新爲舊的,然後將更改作爲插入應用,從而創建新的當前記錄。這個主題有各種各樣的變化。例如,我們可以通過使用INSTEAD OF DELETE觸發器執行更新(設置DELETED_FLAG列)來實施邏輯刪除策略。
另一種情況是,當應用程序需要我們保持一些數據的兩個副本 - 主表和本地表。我們將使用可更新視圖從適當的表中選擇一個INSTEAD OF觸發器來決定將DML應用於哪個表。
這些不是如何設計一個好的,健全的數據模型的光輝事例。但他們是我們偶爾發現自己不得不實施的那種詭計。
感謝您抽出時間來回答我的問題APC。 – caddis 2009-09-03 20:58:58
另一種模式,這是我見過的非常成功的,是當應用程序架構想要從前端隔離數據庫設計。他們希望在數據庫方面做到這一點,而不是通過對象關係框架。
例如,如果你想使前端開發人員的工作很容易,你可以建立每個前端頁面視圖(或一組頁)。然後使用替代觸發器來處理映射回基礎表。
當然,它有助於讓堅實的數據庫開發人員瞭解Oracle如何工作。
謝謝吉姆分享這種使用而非觸發器。 – caddis 2009-09-03 21:01:50
- 1. Oracle SQL而不是刪除觸發器
- 2. Oracle讓Oracle觸發序列而不是Hibernate?
- 3. 實現的,而不是類的實例
- 4. Oracle觸發器,而不是更新和ORA-22816錯誤
- 5. 跨不同TeamCity實例觸發構建
- 6. 而不是刪除之前的觸發
- 7. SQL而不是觸發器有時不會觸發?
- 8. 而不是觸發器不工作
- 9. Oracle錯誤而創建觸發器
- 10. 什麼時候是類型(實例)而不是實例.__ class__?
- 11. Oracle觸發器不更新
- 12. 獲取SQL Server的本地實例而不是命名實例
- 13. 而不是更新觸發位列
- 14. 觸發fancybox懸停而不是點擊?
- 15. addDomListener觸發'load'而不是'click'
- 16. 觸發ActiveRecord :: RecordNotFound而不是返回零
- 17. 另一種方式,而不是觸發
- 18. 創建而不是插入觸發器
- 19. Mysql觸發器做INSERT而不是UPDATE
- 20. Control.Leave觸發MouseDown,而不是MouseUp
- 21. 而不是觸發器更新主鍵
- 22. 獲取觸發Oracle觸發器的值
- 23. 從Oracle實例
- 24. CDI:變空而不是新實例
- 25. multiprocessing.array(python):float expected,而不是numpy.ndarray實例
- 26. Oracle觸發器更新不同表中的實體
- 27. 檢索salesforce實例URL而不是visualforce實例
- 28. 如何註釋類型實例(而不是類實例)?
- 29. 使用JDBC創建的Oracle觸發器不會觸發
- 30. 在本地Oracle實例上開發
http://psoug.org/reference/instead_of_trigger.html – zloctb 2015-11-10 06:37:45