トリガーの定義(行トリガー、文トリガー)

トリガーとは、データの変更などのイベントによって発火(トリガー)して処理するイベント・ドリブン(イベント駆動式)なモジュールのことである。

トリガーの基本構文 (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
		-- DELETE 時 :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 トリガーは行ロック取得後に呼び出されるので、複数回コールされる現象は発生しない。

トリガーを一時的に無効にするための豆知識

あるテーブルの全てのトリガーを一時的に無効化(有効化)したい場合には

ALTER TABLE table_name DISABLE ALL TRIGGERS ;
ALTER TABLE table_name ENABLE ALL TRIGGERS ;

のように一度でテーブル単位にトリガーを有効、無効を切り替えることができる。

特定のトリガーだけを無効化したい場合には

ALTER TRIGGER trigger_name DISABLE;
ALTER TRIGGER trigger_name ENABLE;

とする。

トリガーが有効なのか無効なのかを調べたいときには

SELECT TRIGGER_NAME, STATUS FROM USER_TRIGGERS;
-- または対象のテーブルを限定する場合は
SELECT TRIGGER_NAME, STATUS FROM USER_TRIGGERS
 WHERE TABLE_NAME = 'table_name' ;

で調べることができる。 STATUS 列が 'ENABLED' なら有効、DISABLED なら無効になっている。

トリガーを記述するときの注意事項

  • トリガーの本体は、PL/SQL ブロックで記述 (DECLARE 〜)
  • ホスト変数 :NEW と :OLD はレコード型ではない(擬似的なレコード型)
  • トリガーが設置してあると使えない機能がある ⇒ ダイレクト・パス・インサート
  • パラレル DML とトリガーは相性がよくない
  • (オリジナルの)インポートとトリガーの発動(新規:発動しない、上書き IGNORE=Y:発動する)
  • トリガーのソースコードは通常のストアドプロシージャのデータディクショナリから分離している。
  • トリガーのソースコードの格納形式は LONG の単一行であり、ストアドの提供形式と異なる。
  • トリガーに直接記述ソースはディスプレイ上で全てが見える位の数十行以内にすること。(※)

(※) トリガーのソースはディクショナリ上ではストアドプロシージャなどのソースとは別途管理されており保存形式も異なる。 (改行も含めて 単一行 で管理されている。)
この特異な格納方式によってソースの長いトリガーはトラブルの原因になることがある。ロジックを記述する場合には別途プロシージャなどを呼び出すようにするのが望ましい。
長いソースコードの場合 DBMS_METADATA が機能しないことがある。



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)