1. 程式人生 > >Oracle12C--觸發器(五十二)

Oracle12C--觸發器(五十二)

知識點的梳理:

  • Oracle中的觸發器分為DML觸發器,instead-of(替代)觸發器,DDL觸發器,系統觸發器和資料庫事件觸發器;
  • DML觸發器中分為以下兩類:
    • 表級觸發器:所有更新操作只在之前或之後觸發一次;
    • 行級觸發器:針對更新的每一行分別進行之前或之後觸發;
  • 行級觸發器中可以使用":old"取得更新前的資料,使用":new"取得更新後的資料;
  • 複合觸發器是在Oracle11G之後增加的新功能,可以進行4個觸發事件操作;
  • 如果要對檢視進行更新操作,則應該使用替代觸發器來完成,在替代觸發器中,可以對檢視中包含的多個數據表進行更新操作;
  • 當需要對發生的DDL操作進行觸發時,可以採用DDL觸發器。DDL觸發器可以針對一個使用者或整個資料庫,如果針對資料庫級應該具備管理員許可權;
  • 每一個觸發器只能編寫最多32KB的程式碼,當程式複雜時,可通過過程或函式進行功能切割;
  • 觸發器簡介
    • 觸發器類似於過程和函式;
      • 例:當對某一張表執行更新操作(insert,update,delete)時,都可能引發觸發器執行;
    • 觸發器依靠事件執行;
    • 採用隱式呼叫,不能接收引數
  • 基本語法與分類
    • Oracle中的觸發器分類:DMLinstead-of(替代),DDL,系統或資料庫事件觸發器
    • 所有觸發器都支援的基本建立語法:

CREATE [OR REPLACE] TRIGGER 觸發器名稱
[BEFORE | AFTER] --觸發時間
[INSTEAD OF]
[INSERT | UPDATE |UPDATE OF 列名稱

[,列名稱,...]|DELETE] --觸發事件
ON [表名稱 | 檢視 |DATABASE | SCHEMA] --觸發物件
[REFERENCING [OLD AS 標記] [NEW AS 標記] [PARENT AS 標記]]
[FOR EACH ROW] --觸發頻率
[FOLLOWS 觸發器名稱]
[DISABLE]
[WHEN 觸發條件] --觸發條件
[DECLARE] --觸發操作(程式主體)
[程式宣告部分;]
[PRAGMA AUTONOMOUS_TRANSACTION;]
BEGIN
程式程式碼部分;
END [觸發器名稱];
/

語法作用:
CREATE [OR REPLACE] TRIGGER 觸發器名稱:建立一個觸發器,設定名稱,如果選擇了

OP REPLACE選項,則表示替換已有的觸發器;
[BEFORE | AFTER] :該觸發器的觸發時間,是在操作之前(BEFORE)還是操作之後(AFTER)觸發;

[INSTEAD OF]:替代觸發器,對於檢視操作所定義的觸發器型別;

[INSERT | UPDATE |UPDATE OF 列名稱 [,列名稱,...]|DELETE]:觸發的事件,可以是資料表的增加,修改,刪除,或者部分欄位的更新;
ON [表名稱 | 檢視 |DATABASE | SCHEMA] :觸發器的觸發物件,可以是資料表,檢視,資料庫,模式(使用者);
[REFERENCING [OLD AS 標記] [NEW AS 標記] [PARENT AS 標記]]:對於":old",":new",":parent"這3個識別符號定義別名;
[FOR EACH ROW]:定義行級觸發,沒有此語句就是表級觸發器;

[FOLLOWS 觸發器名稱]:配置多個觸發器執行的先後順序;

[DISABLE]:觸發器建立之後預設是啟用狀態,通過此選項,可將其定義為禁用狀態;

[WHEN 觸發條件]:當滿足指定條件時才執行觸發器操作;
[DECLARE]:觸發器主體程式宣告部分,定義變數或遊標;

[PRAGMA AUTONOMOUS_TRANSACTION;]:自治事務宣告,編寫此語句後會在觸發器中啟動一個子事務處理,並且可以使用COMMIT提交事務;

BEGIN:程式主體部分;

END:觸發器結束標記;

/:完結標記

  • 觸發器注意事項
    • 觸發器不接受任何引數,且只能是在產生了某一個觸發事件之後才會自動呼叫;
    • 對於一張資料表的觸發器,最多隻有12個,同一種類型的觸發器,只能定義一次;
    • 一個觸發器最大為32KB,所以如果需要編寫的程式碼較多,可以通過過程或函式呼叫來完成;
    • 預設情況下,觸發器中不能使用事務處理操作,或採用自治事務進行處理;
    • 在一張資料表中,定義過多的觸發器,會造成DML效能下降;
  • 觸發器相關許可權

CREATE ANY TRIGGER

為任意使用者建立觸發器的許可權

ALTER ANY TRIGGER

修改任意觸發器的許可權

DROP ANY TRIGGER

刪除任意觸發器的許可權