📝 PL/SQLトリガー入門:イベントをきっかけに自動実行!
PL/SQLのトリガー(Trigger)は、特定のイベント(出来事)が発生したときに、自動的に実行されるプログラムです。
特定のイベント(例: データの挿入や更新)が発生したのを察知すると、あらかじめ決められた行動を自動的に実行します。
1. トリガーはどんな時に使うの? 🕵️
トリガーは、以下のような場面で非常に役立ちます。
データの自動導出: データの挿入や更新時に、自動で計算を行い、別の列に値をセットする。
監査ログの記録: 誰が、いつ、どのデータを操作したかを自動で記録する。
ビジネスルールの強制: 特定の条件を満たさないデータ(例: 給与が0円)の挿入や更新を防ぐ。
データの同期: あるテーブルにデータが追加されたら、別のテーブルにも自動的に同じデータを挿入する。
2. トリガーの種類 🚦
トリガーは、主に以下の2つの視点で分類されます。
① イベントの発生タイミング
BEFOREトリガーは、イベントを許可するかどうかを判断したい場合や、データを加工したい場合に便利です。AFTERトリガーは、イベントの結果に応じて別の処理を行いたい場合に適しています。
② 実行レベル
行レベルのトリガーは、FOR EACH ROWというキーワードで区別されます。このキーワードがない場合は、ステートメントレベルのトリガーになります。
3. トリガーの作成方法 ✍️
トリガーの基本的な構文は以下の通りです。
【構文】
CREATE OR REPLACE TRIGGER トリガー名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} [OF 列名]
ON テーブル名
[FOR EACH ROW]
[WHEN (条件)]
BEGIN
-- 実行したいPL/SQLコード
END;
/
[ ] で囲まれた部分は、必要に応じて追加するオプションです。
4. トリガーの便利なオプション 🔧
① :OLD と :NEW
行レベルのトリガーでのみ使用できる特別なキーワードです。
:OLD: 変更前のデータが入った擬似レコード。:NEW: 変更後のデータが入った擬似レコード。
これらのキーワードを使うことで、変更前と変更後の値にアクセスし、差分を追跡したり、値の検証を行ったりできます。
例: 更新前と更新後の名前をログに記録する
-- 行レベルトリガー
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'の行が更新されたときだけ実行
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が更新されたときだけ実行
CREATE OR REPLACE TRIGGER customer_id_change
AFTER UPDATE OF customer_id ON customer
FOR EACH ROW
BEGIN
-- このトリガーは、customer_id列が更新されたときだけ実行される
END;
/
これにより、first_nameやlast_nameを更新しても、このトリガーは実行されません。
これらの機能を使いこなすことで、トリガーはデータベースの整合性やセキュリティを保つための強力なツールとなります。
