すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CREATE TRIGGER

最終更新日:Mar 29, 2026

PolarDB for Oracle におけるテーブルまたはビューにトリガーを作成します。

構文

CREATE [ OR REPLACE ] TRIGGER 名前
  { BEFORE | AFTER | INSTEAD OF }
  { INSERT | UPDATE | DELETE }
      [ OR { INSERT | UPDATE | DELETE } ] [, ...]
    ON テーブル
  [ REFERENCING { OLD AS old | NEW AS new } ...]
  [ FOR EACH ROW ]
  [ WHEN 条件 ]
  [ DECLARE
      [ PRAGMA AUTONOMOUS_TRANSACTION; ]
      宣言; [, ...] ]
    BEGIN
      文; [, ...]
  [ EXCEPTION
    { WHEN 例外 [ OR 例外 ] [...] THEN
        文; [, ...] } [, ...]
  ]
    END

説明

CREATE TRIGGER はトリガーを作成します。CREATE OR REPLACE TRIGGER は、新規のトリガーを作成するか、既存の定義を置き換えます。

CREATE TRIGGER を使用する場合、トリガー名は同一テーブル上で既に定義されている他のすべてのトリガーと異なる必要があります。新規のトリガーは、トリガーイベントが定義されたテーブルと同じスキーマ内に作成されます。

Oracle 互換構文で作成されたトリガーは、SECURITY DEFINER 関数として実行されます。

パラメーター

パラメーター説明
名前トリガーの名前です。
BEFORE | AFTERトリガーがトリガーイベントの前または後に実行されるかを指定します。
INSERT | UPDATE | DELETEトリガーイベントです。OR を使用して複数のイベントを組み合わせることができます。
テーブルトリガーイベントが発生するテーブルまたはビューです。
REFERENCING { OLD AS old | NEW AS new }旧行および新行の値に対するエイリアスです。制約については、「REFERENCING 句」をご参照ください。
FOR EACH ROW指定した場合、行レベルのトリガーは影響を受ける各行ごとに実行されます。省略した場合、ステートメントレベルのトリガーは SQL ステートメントごとに 1 回実行されます。
条件ブール値式です。トリガーは、条件 の評価結果が TRUE の場合にのみ実行されます。FOR EACH ROW を指定した場合は、旧行および新行の値をそれぞれ OLD.列名 および NEW.列名 として参照できます。
PRAGMA AUTONOMOUS_TRANSACTIONトリガーを自律トランザクションとして設定します。
宣言変数、型、REF CURSOR、またはサブプログラムの宣言です。サブプログラムの宣言は、他のすべての変数、型、REF CURSOR の宣言の後に記述する必要があります。
SPL プログラム文です。DECLARE–BEGIN–END ブロック自体も有効な SPL 文であるため、トリガー本体にはネストされたブロックを含めることができます。
例外例外条件の名前です。例: NO_DATA_FOUNDOTHERS など。

REFERENCING 句

REFERENCING 句を使用すると、行レベルのトリガー内で旧行および新行の値を参照できます。

  • OLD は、識別子 old(小文字)またはその小文字表記(REFERENCING OLD AS oldREFERENCING OLD AS OLDREFERENCING OLD AS "old")でのみエイリアス化できます。

  • NEW は、識別子 new(小文字)またはその小文字表記(REFERENCING NEW AS newREFERENCING NEW AS NEWREFERENCING NEW AS "new")でのみエイリアス化できます。

  • 両方の句を組み合わせることも可能です。例: REFERENCING NEW AS New OLD AS Old

この句は Oracle データベースと互換性がありません。なぜなら、old および new 以外の識別子を使用できないためです。

WHEN 句の制約

WHEN 句には、以下の制約が適用されます:

  • INSERT トリガーでは、OLD を参照できません。

  • DELETE トリガーでは、NEW を参照できません。

  • INSTEAD OF を使用するトリガーには、WHEN 句を含めることはできません。

  • WHEN 句にはサブクエリを含めることはできません。

ステートメントレベルのトリガー

以下のトリガーは、INSERTUPDATE、または DELETE 操作が emp テーブルに対して実行されるたびに 1 回だけ実行され、操作内容および現在のユーザーをログ出力します。

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;