標籤:
http://www.cnblogs.com/roucheng/p/3506033.html
觸發器是許多關聯式資料庫系統都提供的一項技術。在ORACLE系統裡,觸發器類似過程和函數,都有聲明,執行和異常處理過程的PL/SQL塊。
1 觸發器類型
觸發器在資料庫裡以獨立的Object Storage Service,它與預存程序和函數不同的是,預存程序與函數需要使用者顯示調用才執行,而觸發器是由一個事件來啟動運行。即觸發器是當某個事件發生時自動地隱式運行。並且,觸發器不能接收參數。所以運行觸發器就叫觸發或點火(firing)。ORACLE事件指的是對資料庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。ORACLE將觸發器的功能擴充到了觸發ORACLE,如資料庫的啟動與關閉等。所以觸發器常用來完成由資料庫的完整性條件約束難以完成的複雜商務規則的約束,或用來監視對資料庫的各種操作,實現審計的功能。
1.1 DML觸發器
ORACLE可以在DML語句進行觸發,可以在DML操作前或操作後進行觸發,並且可以對每個行或語句操作上進行觸發。
1.2 替代觸發器
由於在ORACLE裡,不能直接對由兩個以上的表建立的視圖進行操作。所以給出了替代觸發器。它就是ORACLE 8專門為進行視圖操作的一種處理方法。
1.3 系統觸發器
ORACLE 8i 提供了第三種類型的觸發器叫系統觸發器。它可以在ORACLE資料庫系統的事件中進行觸發,如ORACLE系統的啟動與關閉等。
觸發器組成:
l 觸發事件:引起觸發器被觸發的事件。 例如:DML語句(INSERT, UPDATE, DELETE語句對錶或視圖執行資料處理操作)、DDL語句(如CREATE、ALTER、DROP語句在資料庫中建立、修改、刪除模式對象)、資料庫系統事件(如系統啟動或退出、異常錯誤)、使用者事件(如登入或退出資料庫)。
l 觸發時間:即該TRIGGER 是在觸發事件發生之前(BEFORE)還是之後(AFTER)觸發,也就是觸發事件和該TRIGGER 的操作順序。
l 觸發操作:即該TRIGGER 被觸發之後的目的和意圖,正是觸發器本身要做的事情。 例如:PL/SQL 塊。
l 觸發對象:包括表、視圖、模式、資料庫。只有在這些對象上發生了符合觸發條件的觸發事件,才會執行觸發操作。
l 觸發條件:由WHEN子句指定一個邏輯運算式。只有當該運算式的值為TRUE時,遇到觸發事件才會自動執行觸發器,使其執行觸發操作。
l 觸發頻率:說明觸發器內定義的動作被執行的次數。即語句級(STATEMENT)觸發器和行級(ROW)觸發器。
語句級(STATEMENT)觸發器:是指當某觸發事件發生時,該觸發器只執行一次;
行級(ROW)觸發器:是指當某觸發事件發生時,對受到該操作影響的每一行資料,觸發器都單獨執行一次。
編寫觸發器時,需要注意以下幾點:
l 觸發器不接受參數。
l 一個表上最多可有12個觸發器,但同一時間、同一事件、同一類型的觸發器只能有一個。並各觸發器之間不能有矛盾。
l 在一個表上的觸發器越多,對在該表上的DML操作的效能影響就越大。
l 觸發器最大為32KB。若確實需要,可以先建立過程,然後在觸發器中用CALL語句進行調用。
l 在觸發器的執行部分只能用DML語句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL語句(CREATE、ALTER、DROP)。
l 觸發器中不能包含事務控制語句(COMMIT,ROLLBACK,SAVEPOINT)。因為觸發器是觸發語句的一部分,觸發語句被提交、回退時,觸發器也被提交、回退了。
l 在觸發器主體中調用的任何過程、函數,都不能使用事務控制語句。
l 在觸發器主體中不能申明任何Long和blob變數。新值new和舊值old也不能向表中的任何long和blob列。
l 不同類型的觸發器(如DML觸發器、INSTEAD OF觸發器、系統觸發器)的文法格式和作用有較大區別。
http://www.cnblogs.com/roucheng/p/3504463.html
oracle觸發器類型