トリガーの定義(行トリガー、文トリガー)
トリガーとは、データの変更などのイベントによって発火(トリガー)して処理するイベント・ドリブン(イベント駆動式)なモジュールのことである。
トリガーの基本構文 (DML トリガーの場合)
行トリガーとは、DML によって影響受けた行単位でトリガーを発生させる。
文トリガーは、DML 単位に発生するトリガーである。
トリガーの構文
CREATE [OR REPLACE] TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | DELETE | UPDATE [ OF columns] } または
{ INSERT OR UPDATE OR DELETE } など
ON event_tablename
[ REFERENCING OLD AS old_alias NEW AS new_alias PARENT AS parent_alias ]
[ FOR EACH ROW ]
[ WHEN (condition) ]
{ PL/SQL ブロック | CALL procedure_statement }
- PL/SQL ブロック
[ DECLARE ]
BEGIN
statements ...
END;
行トリガーの作成例
-- CREATE TABLE RIVUS.TEXT_BOOK(A_TEXT VARCHAR2(80));
--
CREATE OR REPLACE TRIGGER RIVUS.TEXT_BOOK_TRG
BEFORE INSERT OR DELETE OR UPDATE OF A_TEXT
ON RIVUS.TEXT_BOOK
FOR EACH ROW WHEN (NEW.A_TEXT IS NOT NULL) -- ← 行トリガー (FOR EACH ROW)
DECLARE -- ← IS / AS でなく DECLARE
eSample EXCEPTION;
BEGIN
IF (INSERTING) THEN
-- INSERT 時 :OLD は NULL
:NEW.A_TEXT := 'ABC';
END IF;
IF (UPDATING) THEN
-- UPDATE 時 :OLD :NEW ともセットされる
:NEW.A_TEXT := :OLD.A_TEXT || '→' || :NEW.A_TEXT;
END IF;
IF (DELETING) THEN
-- DELET 時 :NEW は NULL
NULL;
END IF;
END;
/
このトリガーは ...
- TEXT_BOOK_TRG トリガーは RIVUS.TEXT_BOOK テーブルに対して設置されているものである。
- 各 DML による 行ロックが発生する前に発動する。(※)
- INSERT、DELETE または A_TEXT カラムが UPDATE されることにより発動する。
- DML によって影響を受けた行単位に呼び出されるが A_TEXT が NULL 以外の時に限る。
- トリガーの本体は PL/SQL ブロック形式
(※) DML による同一行のロック取得の衝突によって再試行が行われるために同一行の BEFORE トリガーが複数回コールされることがある。
AFTER トリガーは行ロック取得後に呼び出されるので、複数回コールされる現象は発生しない。
注意事項
- トリガーの本体は、PL/SQL ブロックで記述 (DECLARE 〜)
- ホスト変数 :NEW と :OLD はレコード型ではない(擬似的なレコード型)
- トリガーが設置してあると使えない機能がある ⇒ ダイレクト・パス・インサート
- パラレル DML とトリガーは相性がよくない
- (オリジナルの)インポートとトリガーの発動(新規:発動しない、上書き IGNORE=Y:発動する)
- トリガーのソースコードは通常のストアドプロシージャのデータディクショナリから分離している。
- トリガーのソースコードの格納形式は LONG の単一行であり、ストアドの提供形式と異なる。
- トリガーに直接記述ソースはディスプレイ上で全てが見える位の数十行以内にすること。(※)
(※) トリガーのソースはディクショナリ上ではストアドプロシージャなどのソースとは別途管理されており保存形式も異なる。
(改行も含めて 単一行 で管理されている。)
この特異な格納方式によってソースの長いトリガーはトラブルの原因になることがある。ロジックを記述する場合には別途プロシージャなどを呼び出すようにするのが望ましい。
長いソースコードの場合 DBMS_METADATA が機能しないことがある。
関連事項