トリガーを作成します。

構文

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 キーワードを使用して新しいトリガーを作成する場合、新しいトリガーの名前は、同じテーブルで定義されている既存のトリガーとは異なる名前である必要があります。 新しいトリガーは、トリガーイベントが定義されているテーブルと同じスキーマに作成されます。

既存のトリガーの定義を更新するには、CREATE OR REPLACE TRIGGER キーワードを使用できます。

Oracle と互換性のある構文を使用してトリガーを作成する場合、トリガーは SECURITY DEFINER 関数として実行されます。

パラメーター

パラメーター 説明
name 作成するトリガーの名前。
BEFORE | AFTER トリガーがトリガーイベントの前または後に実行されるかどうかを指定します。
INSERT | UPDATE | DELETE トリガーイベント。
table トリガーイベントが発生するテーブルまたはビューの名前。
condition 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 という名前の識別子、または小文字で保存された同等の識別子でのみ置き換えることができます。 たとえば、文は REFERENCING OLD AS old、REFERENCING OLD AS OLD、または REFERENCING OLD AS "old" の場合があります。 また、新しい値は、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 を指定できます。

old や new の識別子以外は使用できないため、この句は Oracle データベースと互換性がありません。
FOR EACH ROW トリガーが、トリガーイベントにより影響を受ける行ごとに実行されるか、各 SQL 文によって 1 回だけ実行されるかを指定します。 指定した場合、影響を受ける行ごとに行レベルのトリガーが実行されます それ以外の場合は、文レベルのトリガーが実行されます。
PRAGMA AUTONOMOUS_TRANSACTION PRAGMA AUTONOMOUS_TRANSACTION は、自律型トランザクションとしてトリガーを設定するディレクティブです。
declaration 変数、型、REF CURSOR、またはサブプログラム宣言。 サブプログラム宣言が含まれている場合は、他のすべての変数、型、および REF CURSOR 宣言の後に宣言する必要があります。
statement SPL プログラム文。 DECLARE-BEGIN-END ブロックは SPL 文と見なされることにご注意ください。 したがって、トリガー本体にはネストされたブロックを含めることができます。
exception NO_DATA_FOUND や OTHERS などの例外条件の名前。

次の文レベルのトリガーは、トリガー文 (emp テーブルで INSERT、UPDATE、または DELETE) の実行後に実行されます。

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;