9. PL/SQL トリガー

 


📝 PL/SQLトリガー入門:イベントをきっかけに自動実行!

PL/SQLのトリガー(Trigger)は、特定のイベント(出来事)が発生したときに、自動的に実行されるプログラムです。

特定のイベント(例: データの挿入や更新)が発生したのを察知すると、あらかじめ決められた行動を自動的に実行します。


1. トリガーはどんな時に使うの? 🕵️

トリガーは、以下のような場面で非常に役立ちます。

  • データの自動導出: データの挿入や更新時に、自動で計算を行い、別の列に値をセットする。

  • 監査ログの記録: 誰が、いつ、どのデータを操作したかを自動で記録する。

  • ビジネスルールの強制: 特定の条件を満たさないデータ(例: 給与が0円)の挿入や更新を防ぐ。

  • データの同期: あるテーブルにデータが追加されたら、別のテーブルにも自動的に同じデータを挿入する。


2. トリガーの種類 🚦

トリガーは、主に以下の2つの視点で分類されます。

① イベントの発生タイミング

トリガーの種類実行タイミング
BEFORE トリガーイベントが発生する前に実行。
AFTER トリガーイベントが発生した後に実行。

BEFOREトリガーは、イベントを許可するかどうかを判断したい場合や、データを加工したい場合に便利です。AFTERトリガーは、イベントの結果に応じて別の処理を行いたい場合に適しています。

② 実行レベル

トリガーの種類実行回数
ステートメントレベルトランザクション全体で1回だけ実行。何行のデータが変更されても関係ない。
行レベル変更される行ごとに1回ずつ実行。10行更新されたら、10回実行される。

行レベルのトリガーは、FOR EACH ROWというキーワードで区別されます。このキーワードがない場合は、ステートメントレベルのトリガーになります。


3. トリガーの作成方法 ✍️

トリガーの基本的な構文は以下の通りです。

【構文】

SQL
CREATE OR REPLACE TRIGGER トリガー名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} [OF 列名]
ON テーブル名
[FOR EACH ROW]
[WHEN (条件)]
BEGIN
  -- 実行したいPL/SQLコード
END;
/

[ ] で囲まれた部分は、必要に応じて追加するオプションです。


4. トリガーの便利なオプション 🔧

:OLD:NEW

行レベルのトリガーでのみ使用できる特別なキーワードです。

  • :OLD: 変更前のデータが入った擬似レコード。

  • :NEW: 変更後のデータが入った擬似レコード。

これらのキーワードを使うことで、変更前と変更後の値にアクセスし、差分を追跡したり、値の検証を行ったりできます。

イベント:OLD:NEW
INSERTNULL新しい値
UPDATE古い値新しい値
DELETE古い値NULL

例: 更新前と更新後の名前をログに記録する

SQL
-- 行レベルトリガー
CREATE OR REPLACE TRIGGER log_name_changes
AFTER UPDATE OF first_name ON customer
FOR EACH ROW
BEGIN
  INSERT INTO audit_log (old_first_name, new_first_name)
  VALUES (:OLD.first_name, :NEW.first_name);
END;
/

WHEN

FOR EACH ROW(行レベル)トリガーでのみ使えます。特定の条件を満たす行が操作されたときにだけ、トリガーを実行させたい場合に指定します。

例: regionが'SOUTH'の行が更新されたときだけ実行

SQL
CREATE OR REPLACE TRIGGER customer_after_update
AFTER UPDATE ON customer
FOR EACH ROW
WHEN (OLD.region = 'SOUTH')
BEGIN
  -- このトリガーは、更新対象の行の`region`が'SOUTH'のときだけ実行される
END;
/

WHEN句では、:OLDキーワードの前にコロン(:)をつけない点に注意してください。

OF

UPDATEトリガーで使います。特定の列の値が変更されたときだけトリガーを実行したい場合に指定します。

例: customer_idが更新されたときだけ実行

SQL
CREATE OR REPLACE TRIGGER customer_id_change
AFTER UPDATE OF customer_id ON customer
FOR EACH ROW
BEGIN
  -- このトリガーは、customer_id列が更新されたときだけ実行される
END;
/

これにより、first_namelast_nameを更新しても、このトリガーは実行されません。

これらの機能を使いこなすことで、トリガーはデータベースの整合性やセキュリティを保つための強力なツールとなります。

前の記事:8. PL/SQL コレクション