トリガーを作成します。
構文
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 と評価された場合、トリガーが実行されます。
|
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;