全部產品
Search
文件中心

PolarDB:CREATE TRIGGER

更新時間:Jul 06, 2024

定義新觸發器。

文法

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在其中發生觸發事件的表的名稱。
conditioncondition 是 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_TRANSACTIONPRAGMA 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;