CREATE TRIGGER 命令定義將儲存在資料庫中的觸發器並對其進行命名。
文法
定義新觸發器
CREATE TRIGGER
概要
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,則將觸發觸發器。
如果觸發器定義包含 FOR EACH ROW 關鍵字,那麼 WHEN 子句可以分別通過寫入 OLD.column_name 或 NEW.column_name 來引用舊和/或新行值的列。INSERT 觸發器無法引用 OLD,DELETE 觸發器無法引用 NEW。 如果觸發器包含 INSTEAD OF 關鍵字,則可能不會包含 WHEN 子句。 WHEN 子句不能包含子查詢。 |
| 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 等。 |