定義新觸發器。
文法
CREATE [ OR REPLACE ] TRIGGER name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE }
[ OR { INSERT | UPDATE | DELETE } ] [, ...]
ON table
[ REFERENCING { OLD AS old | NEW AS new } ...]
[ FOR EACH ROW ]
[ WHEN condition ]
[ DECLARE
[ PRAGMA AUTONOMOUS_TRANSACTION; ]
declaration; [, ...] ]
BEGIN
statement; [, ...]
[ EXCEPTION
{ WHEN exception [ OR exception ] [...] THEN
statement; [, ...] } [, ...]
]
END說明
CREATE TRIGGER 定義新觸發器。CREATE OR REPLACE TRIGGER 將建立新觸發器,或替換現有定義。
如果使用 CREATE TRIGGER 關鍵字建立新觸發器,則新觸發器的名稱不得與同一表中定義的任何現有觸發器匹配。新觸發器將在與定義觸發事件的表相同的 schema 中建立。
如果要更新現有觸發器的定義,可使用 CREATE OR REPLACE TRIGGER 關鍵字。
如果使用與 Oracle 相容的文法建立觸發器,則觸發器作為 SECURITY DEFINER 函數運行。
參數
| 參數 | 說明 |
| name | 要建立的觸發器的名稱。 |
| BEFORE | AFTER | 確定是在觸發事件之前還是之後觸發觸發器。 |
| INSERT | UPDATE | DELETE | 定義觸發事件。 |
| table | 在其中發生觸發事件的表的名稱。 |
| condition | condition 是 Boolean 運算式,確定是否實際執行觸發器。如果 condition 的求值結果為 TRUE,則將觸發觸發器。
|
| REFERENCING { OLD AS old | NEW AS new } ... | 用於引用舊行和新行的 REFERENCING 子句,但受到限制,因為 old 只能由名為 old 的標識符或以全小寫形式儲存的任何等效項替換(例如,REFERENCING OLD AS old、REFERENCING OLD AS OLD 或 REFERENCING OLD AS "old")。此外,new 只能由名為 new 的標識符或以全小寫形式儲存的任何等效項替換(例如,REFERENCING NEW AS new、REFERENCING NEW AS NEW 或 REFERENCING NEW AS "new")。 可以在 REFERENCING 子句中指定以下兩個短語或其中一個:OLD AS old 和 NEW AS new(例如,REFERENCING NEW AS New OLD AS Old)。 說明 此子句與 Oracle 資料庫不相容,因為不能使用 old 或 new 之外的標識符。 |
| FOR EACH ROW | 確定是應當為受觸發事件影響的每一行觸發一次觸發器,還是只按每個 SQL 陳述式觸發一次。如果指定,則為受影響的每一行觸發一次觸發器(行級觸發器),否則觸發器為語句級觸發器。 |
| PRAGMA AUTONOMOUS_TRANSACTION | PRAGMA AUTONOMOUS_TRANSACTION 是將觸發器設定為自治事務的指令。 |
| declaration | 變數、類型、REF CURSOR 或子程式聲明。如果包括子程式聲明,則它們必須在所有其他變數、類型和 REF CURSOR 聲明之後。 |
| statement | 一個 SPL 程式語句。請注意,DECLARE - BEGIN - END 塊被視為 SPL 語句本身。因此,觸發器主體可能包含嵌套塊。 |
| exception | 異常條件名稱,如 NO_DATA_FOUND、OTHERS 等。 |
樣本
以下是語句級觸發器,在執行觸發語句(在表 emp 中進行插入、更新或刪除操作)之後觸發。
CREATE OR REPLACE TRIGGER user_audit_trig
AFTER INSERT OR UPDATE OR DELETE ON emp
DECLARE
v_action VARCHAR2(24);
BEGIN
IF INSERTING THEN
v_action := ' added employee(s) on ';
ELSIF UPDATING THEN
v_action := ' updated employee(s) on ';
ELSIF DELETING THEN
v_action := ' deleted employee(s) on ';
END IF;
DBMS_OUTPUT.PUT_LINE('User ' || USER || v_action ||
TO_CHAR(SYSDATE,'YYYY-MM-DD'));
END;以下是行級觸發器,在表 emp 中對每一行進行插入、更新或刪除操作之前觸發。
CREATE OR REPLACE TRIGGER emp_sal_trig
BEFORE DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
DECLARE
sal_diff NUMBER;
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('Inserting employee ' || :NEW.empno);
DBMS_OUTPUT.PUT_LINE('..New salary: ' || :NEW.sal);
END IF;
IF UPDATING THEN
sal_diff := :NEW.sal - :OLD.sal;
DBMS_OUTPUT.PUT_LINE('Updating employee ' || :OLD.empno);
DBMS_OUTPUT.PUT_LINE('..Old salary: ' || :OLD.sal);
DBMS_OUTPUT.PUT_LINE('..New salary: ' || :NEW.sal);
DBMS_OUTPUT.PUT_LINE('..Raise : ' || sal_diff);
END IF;
IF DELETING THEN
DBMS_OUTPUT.PUT_LINE('Deleting employee ' || :OLD.empno);
DBMS_OUTPUT.PUT_LINE('..Old salary: ' || :OLD.sal);
END IF;
END;