Oracle:Trigger
構文
CREATE [ OR REPLACE ] TRIGGER トリガー名
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE [OF 列名,...] | DELETE }
[OR {INSERT | UPDATE [OF 列名,...] | DELETE }]
[ REFERENCING OLD AS old_alias NEW AS new_alias PARENT AS parent_alias]
ON テーブル名
[ FOR EACH ROW ]
[ WHEN 条件式 ]
BEGIN
処理内容
END
;
OR REPLACE
同じ名前のトリガーがあった場合は上書きする。
BEFORE | AFTER | INSTEAD OF
トリガーを起動させるタイミング。
* before:データが操作される前
* after:データが操作された後
* instead of:データが操作されるSQLが実行された時、そのSQLは実行せずにトリ
ガーだけを起動する
INSERT | UPDATE | DELETE
トリガーの起動イベント。
ON テーブル名
トリガーの起動対象テーブル。
FOR EACH ROW
この宣言があると、行トリガー。(:old、:new を使い、操作されたレコードを指定
できる。)
無い場合、文トリガー。(レコードを指定できない。)
REFERENCINGオプション
トリガーとの名前の競合の回避。 oldまたはnewと、名前がバッティングする時、エイリアスを付けて、重複を避ける事 ができる。
[WHEN 条件式]
トリガーの起動条件。 一定の条件を満たした場合にのみトリガーを起動させることができる。
<バインド変数(ホスト変数)>
トリガー内で更新前後の値を参照できる。
:old.列名
:new.列名
値が参照できるのは行トリガーのみで文トリガーは参照できない。
また、起動イベントによりold/newに格納される値が異なる。
起動イベント | old | new |
---|---|---|
INSERT | NULL | 更新後の値 |
UPDATE | 更新前の値 | 更新後の値 |
DELETE | 更新前の値 | NULL |
※値が参照できるのは行トリガーのみで文トリガーは参照できない。
Tips
起動イベントの分岐
起動イベントでINSERT OR UPDATE OR DELETEとした場合に、トリガー内で処理を分岐 するにはDMLの種類を評価します。
IF INSERTING THEN -- INSERTの場合
...
ELSIF UPDATING THEN -- UPDATEの場合
...
ELSIF DELETING THEN -- DELETEの場合
...
END IF;
注意点
・トリガー内の処理でCOMMITやROLLBACKは禁止
トリガーは上位のトランザクションよる起動されるので、トリガー内でCOMMITを行う
と、上位のトランザクションでROLLBACKができなくなります。
・起動対象テーブルへのデータ更新
例えば、UPDATEイベントで起動されるトリガ内でデータ更新をすると、メモリがなく
なるまで再帰処理を続けます
有効/無効の切り替え
無効
ALTER TRIGGER <トリガー名> DISABLE;
有効
ALTER TRIGGER <トリガー名> ENABLE;
状態確認
SELECT
trigger_name, status
FROM
user_triggers
<参考サイト>
[Oracle]データベーストリガーの作成方法
http://skill-note.net/post-579/
ORACLE/TRIGGER編 - オラクルちょこっとリファレンス
http://oracle-chokotto.com/ora_trigger.html