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_FOUND や OTHERS など。 |
REFERENCING 句
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 NEW AS New OLD AS Old。
この句は Oracle データベースと互換性がありません。なぜなら、oldおよびnew以外の識別子を使用できないためです。
WHEN 句の制約
WHEN句には、以下の制約が適用されます:
INSERTトリガーでは、OLDを参照できません。
DELETEトリガーでは、NEWを参照できません。
INSTEAD OFを使用するトリガーには、WHEN句を含めることはできません。
WHEN句にはサブクエリを含めることはできません。
例
ステートメントレベルのトリガー
以下のトリガーは、INSERT、UPDATE、または 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;