Oracleのトリガー(trigger)とは

Oracleのトリガー(trigger)

Oracleの「トリガー」(trigger)とはテーブルのデータ更新などのタイミングでストアドプロシージャ、ストアドファンクションを実行できるものです。

トリガーは文字通り「引き金」です。

トリガーの構文

トリガーの構文はこちらです。

-- トリガーを作成
CREATE OR REPLACE TRIGGER トリガー名
 {BEFORE | AFTER | INSTEAD OF}
 {INSERT | UPDATE | DELETE}
 ON テーブル名
 (FOR EACH ROW)

BEGIN
 処理を記述(PL/SQL)
END;

トリガー(trigger)の作成例

例えば、「EMP」テーブルに新規の従業員を更新するついでに、そのデータを別のテーブル「EMP_NEW」にもコピーするケースを考えてみます。

さっそくやってみましょう!

「EMP」テーブルが更新されたら、自動的に「EMP_NEW」テーブルを更新するトリガーを作成します。

「EMP_NEWテーブルを更新する」のはトリガーの中でもよいですが、ソースをわかりやすくするために、今回はストアドプロシージャ「PRO_A」とします。

「PRO_A」で「EMP_NEWテーブルを更新する」のですが、中身は割愛します。

ここではトリガー「TRI1」を作成します。

-- TRI1トリガーを作成
-- EMPテーブルがINSERT,UPDATEされる前に行毎にPRO_Aを実行するトリガー

CREATE OR REPLACE TRIGGER TRI1
 BEFORE
 INSERT OR UPDATE
 ON EMP
 FOR EACH ROW

BEGIN
 PRO_A
END;

この例では、「EMP」テーブルでINSERTもしくはUPDATEが発生する直前に「PRO_A」を実行するトリガーです。

ここではトリガーの中身をストアドプロシージャ「PRO_A」として別のプログラムにしましたが、「BEGIN」の中に処理を書いてもOKです。

トリガーのBEFORE、AFTER、INSTEAD OF

  • BEFORE・・・テーブルの更新前にトリガー実行される
  • AFTER・・・テーブルの更新後にトリガー実行される
  • INSTEAD OF・・・テーブルの更新はしないでトリガーのみが実行される

「BEFORE」というのはテーブルが更新される「前」に実行するという意味です。更新された後に実行したい場合は「AFTER」とします。

上の例では「EMP」が登録・更新される「前」に「PRO_A」(EMP_NEWテーブルを更新)が実行されます。

行トリガーと文トリガー

「FOR EACH ROW」というのは「行トリガー」といい、1行ごとに「PRO_A」を実行します。

「1行更新」→「PRO_A実行」→「1行更新」→「PRO_A実行」という順番で実行するので「PRO_A」は何度も呼び出されます。

この「FOR EACH ROW」を記述しないと「文トリガー」となります。「文トリガー」は更新される前(後)に一度だけ「PRO_A」が呼び出されます。

「FOR EACH ROW」の違いはザックリいうとこんな感じです。

  • 「何度も」・・・行トリガー
  • 「1回だけ」・・・文トリガー

Oracleのトリガーの注意点

このケースではトリガーのタイミングはINSERTかUPDATEでしたが、DELETEでも可能ですし、startupやshutdownイベントでもトリガーをしかけることができます。

トリガーはバックグラウンドで自動処理できるのでとても便利ですが、やりすぎると把握できなくなってしまうので使いすぎは要注意です。

参照:トリガーの使用

以上、Oracleのトリガー(trigger)のまとめした。

 

コメント