數據庫中觸發器的創建與注意事項


【IT專家網獨家】  觸發器是特殊的存儲過程,但它的執行不是由手工調用,也不是由程序執行,觸發器必須由事件才能觸發。觸發器的觸發事件分可為3類,分別是DML事件、DDL事件和數據庫事件。

  DML觸發器的要點

  DML觸發器是定義在表上的觸發器,由DML事件引發。編寫DML觸發器的要素是:

  確定觸發的表,即在其上定義觸發器的表。

  確定觸發的事件,DML觸發器的觸發事件有INSERT、UPDATE和DELETE三種

  確定觸發時間。觸發的時間有BEFORE和AFTER兩種,分別表示觸發動作發生在DML語句執行之前和語句執行之后。

  確定觸發級別,有語句級觸發器和行級觸發器兩種。語句級觸發器表示SQL語句只觸發一次觸發器,行級觸發器表示SQL語句影響的每一行都要觸發一次。

  由於在同一個表上可以定義多個DML觸發器,因此觸發器本身和引發觸發器的SQL語句在執行的順序上有先后的關系。它們的順序是:

  如果存在語句級BEFORE觸發器,則先執行一次語句級BEFORE觸發器。

  在SQL語句的執行過程中,如果存在行級BEFORE觸發器,則SQL語句在對每一行操作之前,都要先執行一次行級BEFORE觸發器,然后才對行進行操作。如果存在行級AFTER觸發器,則SQL語句在對每一行操作之后,都要再執行一次行級AFTER觸發器。

  如果存在語句級AFTER觸發器,則在SQL語句執行完畢后,要最后執行一次語句級AFTER觸發器。

  DML觸發器還有一些具體的問題,說明如下:

  如果有多個觸發器被定義成為相同時間、相同事件觸發,且最后定義的觸發器是有效的,則最后定義的觸發器被觸發,其他觸發器不執行。

  一個觸發器可由多個不同的DML操作觸發。在觸發器中,可用INSERTING、DELETING、UPDATING謂詞來區別不同的DML操作。這些謂詞可以在IF分支條件語句中作為判斷條件來使用。

  在行級觸發器中,用:new 和:old(稱為偽記錄)來訪問數據變更前后的值。但要注意,INSERT語句插入一條新記錄,所以沒有:old記錄,而DELETE語句刪除掉一條已經存在的記錄,所以沒有:new記錄。UPDATE語句既有:old記錄,也有:new記錄,分別代表修改前后的記錄。引用具體的某一列的值的方法是:

  :old.字段名或:new.字段名

  觸發器體內禁止使用COMMIT、ROLLBACK、SAVEPOINT語句,也禁止直接或間接地調用含有上述語句的存儲過程。

  定義一個觸發器時要考慮上述多種情況,並根據具體的需要來決定觸發器的種類。

創建DML觸發器需要CREATE TRIGGER系統權限。創建DML觸發器的語法如下:

  CREATE OR REPLACE TRIGGER TG_NAME

  BEFORE | AFTER

  INSERT OR DELETE OR UPDATE [OF COL1,COL2,...]

  ON 表名

  [FOR EACH ROW]

  [WHEN 條件]

  DECLARE

  ...

  BEGIN

  ....

  EXCEPTION

  ...

  END;

  注: A) FOR EACH ROW 代表行級觸發器.

  B) WHEN: 只有符合該條件的時候才進行觸發.

  C) 可以通過INSERTING,DELETING,UPDATING來識別INSERT,DELETE,UPDATE操作.

  D) 用:new 和:old(稱為偽記錄)來訪問數據變更前后的值。

  :NEW :INSERT,UPDATE之后的數據.

  :OLD :DELETE,UDPATE之前的數據.

  :old.字段名或:new.字段名

  E) 觸發器中的操作與觸發事件(INSERT,UPDATE,DELETE)一起進行COMMIT和ROLLBACK;

  REM 創建包含插入、刪除、修改多種觸發事件的觸發器DML_LOG,對EMP表的操作進行記錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM