觸發(fā)器是特定事件出現的時候,自動執(zhí)行的代碼塊。類似于存儲過程,但是用戶不能直接調用他們。
觸發(fā)器功能
1、 允許/限制對表的修改
2、 自動生成派生列,比如自增字段
3、 強制數據一致性
4、 提供審計和日志記錄
5、 防止無效的事務處理
6、 啟用復雜的業(yè)務邏輯
觸發(fā)器種類
觸發(fā)器的種類可劃分為4種:1.數據操縱語言(DML)觸發(fā)器、2.替代(INSTEAD OF)觸發(fā)器、3.數據定義語言(DDL)觸發(fā)器、4.數據庫事件觸發(fā)器。
數據操縱語言(DML)觸發(fā)器:簡稱DML觸發(fā)器,是定義在表上的觸發(fā)器,創(chuàng)建在表上。由DML事件引發(fā)的觸發(fā)器,編寫DML觸發(fā)器時的兩點要素是: 1.確定觸發(fā)的表,即在其上定義觸發(fā)器的表。2.確定觸發(fā)的事件,DML觸發(fā)器的觸發(fā)事件有INSERT、UPDATE和DELETE三種;替代觸發(fā)器,簡稱INSTEAD OF觸發(fā)器,創(chuàng)建在視圖上,用來替換對視圖進行的刪除、插入和修改操作; 數據定義語言(DDL)觸發(fā)器,簡稱DDL觸發(fā)器,定義在模式上,觸發(fā)事件是數據對象的創(chuàng)建和修改;數據庫事件觸發(fā)器,定義在整個數據庫或模式上,觸發(fā)事件是數據庫事件.
ORACLE產生數據庫觸發(fā)器的語法為:
CREATE [OR REPLACE] TRIGGER 觸發(fā)器名
{BEFORE|AFTER|INSTEAD OF} 觸發(fā)事件1 [OR 觸發(fā)事件2...]
ON 表名
WHEN 觸發(fā)條件
[FOR EACH ROW]
DECLARE
聲明部分
BEGIN
主體部分
END;
其中:
觸發(fā)器名:觸發(fā)器對象的名稱。由于觸發(fā)器是數據庫自動執(zhí)行的,因此該名稱只是一個名稱,沒有實質的用途。一個觸發(fā)器可由多個不同的數據操縱語言操作觸發(fā)。在觸發(fā)器中,可用INSERTING、DELETING、UPDATING謂詞來區(qū)別不同的數據操縱語言操作。這些謂詞可以在IF分支條件語句中作為判斷條件來使用。
觸發(fā)時間:指明觸發(fā)器何時執(zhí)行,該值可取, 觸發(fā)的時間有BEFORE和AFTER兩種,分別表示觸發(fā)動作發(fā)生在DML語句執(zhí)行之前和語句執(zhí)行之后。確定觸發(fā)級別,有語句級觸發(fā)器和行級觸發(fā)器兩種。語句級觸發(fā)器表示SQL語句只觸發(fā)一次觸發(fā)器,行級觸發(fā)器表示SQL語句影響的每一行都要觸發(fā)一次。
Before:表示在數據庫動作之前觸發(fā)器執(zhí)行;在SQL語句的執(zhí)行過程中,如果存在行級BEFORE觸發(fā)器,則SQL語句在對每一行操作之前,都要先執(zhí)行一次行級BEFORE觸發(fā)器,然后才對行進行操作。如果存在行級AFTER觸發(fā)器,則SQL語句在對每一行操作之后,都要再執(zhí)行一次行級AFTER觸發(fā)器。
after:表示在數據庫動作之后出發(fā)器執(zhí)行。如果存在語句級AFTER觸發(fā)器,則在SQL語句執(zhí)行完畢后,要最后執(zhí)行一次語句級AFTER觸發(fā)器。
觸發(fā)事件:指明哪些數據庫動作會觸發(fā)此觸發(fā)器,指INSERT、DELETE或UPDATE事件,事件可以并行出現,中間用OR連接;
insert:數據庫插入會觸發(fā)此觸發(fā)器;
update:數據庫修改會觸發(fā)此觸發(fā)器;
delete:數據庫刪除會觸發(fā)此觸發(fā)器。
表 名:數據庫觸發(fā)器所在的表。
for each row:表示觸發(fā)器為行級觸發(fā)器,省略則為語句級觸發(fā)器,對表的每一行觸發(fā)器執(zhí)行一次。
觸發(fā)器的創(chuàng)建者或具有DROP ANY TIRGGER系統(tǒng)權限的人才能刪除觸發(fā)器。刪除觸發(fā)器的語法如下:
DROP TIRGGER 觸發(fā)器名
可以通過命令設置觸發(fā)器的可用狀態(tài),使其暫時關閉或重新打開,即當觸發(fā)器暫時不用時,可以將其置成無效狀態(tài),在使用時重新打開。該命令語法如下:
ALTER TRIGGER 觸發(fā)器名 {DISABLE|ENABLE}
其中,DISABLE表示使觸發(fā)器失效,ENABLE表示使觸發(fā)器生效。
同存儲過程類似,觸發(fā)器可以用SHOW ERRORS 檢查編譯錯誤。
如果有多個觸發(fā)器被定義成為相同時間、相同事件觸發(fā),且最后定義的觸發(fā)器是有效的,則最后定義的觸發(fā)器被觸發(fā),其他觸發(fā)器不執(zhí)行。觸發(fā)器體內禁止使用COMMIT、ROLLBACK、SAVEPOINT語句,也禁止直接或間接地調用含有上述語句的存儲過程。定義一個觸發(fā)器時要考慮上述多種情況,并根據具體的需要來決定觸發(fā)器的種類。
觸發(fā)器的作用
觸發(fā)器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:
(1) 強化約束(Enforce restriction)
觸發(fā)器能夠實現比CHECK 語句更為復雜的約束。
(2) 跟蹤變化Auditing changes
觸發(fā)器可以偵測數據庫內的操作,從而不允許數據庫中未經許可的指定更新和變化。
(3) 級聯運行(Cascaded operation)。
觸發(fā)器可以偵測數據庫內的操作,并自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發(fā)器被觸發(fā)。
(4) 存儲過程的調用(Stored procedure invocation)。
為了響應數據庫更新觸,發(fā)器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS( 數據庫管理系統(tǒng))本身之外進行操作。
由此可見,觸發(fā)器可以解決高級形式的業(yè)務規(guī)則或復雜行為限制以及實現定制記錄等一些方面的問題。例如,觸發(fā)器能夠找出某一表在數據修改前后狀態(tài)發(fā)生的差異,并根據這種差異執(zhí)行一定的處理。此外一個表的同一類型(INSERT、 UPDATE、 DELETE)的多個觸發(fā)器能夠對同一種數據操作采取多種不同的處理。
總體而言,觸發(fā)器性能通常比較低。
當運行觸發(fā)器時,系統(tǒng)處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在數據庫設備上,而刪除表和插入表總是位于內存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費的時間長短。