データベース操作・制御

トリガー とりがー

自動実行イベント駆動ストアドプロシージャデータ整合性監査ログSQL
トリガーについて教えて

簡単に言うとこんな感じ!

トリガーは「DBの番人センサー」だよ! 注文が入ったら自動的に在庫を減らす、レコードを更新したら履歴テーブルにコピーする、みたいな「あの操作が起きたら、これを自動でやる」を設定できる。アプリ側でコードを書かなくてもDBが自動で動いてくれるんだ!


トリガーとは

トリガー(Trigger)とは、テーブルに対して「INSERT・UPDATE・DELETE」などの操作(イベント)が行われた際に、自動的にあらかじめ登録した処理を実行するDB内の仕組みです。「引き金(trigger)を引くと自動で発火する」という名前そのままの動作をします。

例えば「注文テーブルに新しい行がINSERTされたら、在庫テーブルの数量を自動でデクリメントする」「社員テーブルが更新されたら、変更前のデータを監査ログテーブルに自動コピーする」といった処理をDB側で完結させることができます。アプリケーションコードに処理を書き忘れる心配がなく、どの経路でデータが変更されても必ず実行されるのが大きなメリットです。

一方、処理が「見えない場所で自動実行される」ため、デバッグが難しくなる・パフォーマンスへの影響が見えにくいというデメリットもあります。乱用するとシステムの動作が追いにくくなるため、監査ログ・データ整合性の強制・導出列の自動更新など限定的な用途に使うのが一般的です。


トリガーの種類と実行タイミング

種類実行タイミング説明
BEFORE トリガー操作の前入力値の検証・変換。NEW値を変更して実際のINSERT/UPDATEに影響できる
AFTER トリガー操作の後監査ログの記録・関連テーブルへの反映など副作用的な処理に使う
INSTEAD OF トリガー操作の代わりにビューへの更新操作を実際のテーブル操作に変換する際に使用
行レベルトリガー各行の変更毎UPDATE で10行変更されたら10回実行(FOR EACH ROW)
文レベルトリガーSQL文1本毎UPDATE文が1本実行されたら1回だけ実行(FOR EACH STATEMENT)
トリガーのフロー例:注文時に在庫を自動更新 アプリが 注文テーブルにINSERT AFTER INSERT トリガー 自動発火! 在庫テーブルを 自動でUPDATE さらに監査ログテーブルにも 自動でINSERT(多段トリガー) アプリは「注文をINSERTした」だけ。後続処理はDB側が自動対応

PostgreSQLでのトリガー例

-- 監査ログ用のトリガー関数
CREATE OR REPLACE FUNCTION log_employee_changes()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO employee_audit_log (
        employee_id, old_salary, new_salary, changed_at, changed_by
    ) VALUES (
        OLD.id, OLD.salary, NEW.salary, NOW(), current_user
    );
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- トリガーの登録(社員テーブルのUPDATE時に発火)
CREATE TRIGGER trg_employee_salary_change
AFTER UPDATE OF salary ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_changes();

歴史と背景

  • 1992年:SQL-92 にトリガーの概念が盛り込まれるが、完全な標準化は SQL:1999 まで待つ
  • 1994年頃:Sybase・Oracle が独自のトリガー実装を先行リリース。その後 SQL Server がほぼ同仕様で採用
  • 1999年:SQL:1999 でトリガーが国際標準化。行トリガー・文トリガーの区別が規定される
  • 2000年代:PostgreSQL がトリガー機能を充実。PL/pgSQL・PL/Python など多言語でのトリガー関数が利用可能に
  • 現在マイクロサービスイベント駆動アーキテクチャの普及で「DBトリガーの代わりにメッセージキュー(Kafka等)を使う」設計も増えているが、監査・整合性維持では依然として重要

関連する規格・RFC

規格内容
ISO/IEC 9075 SQL:1999トリガーの国際標準化(行/文レベル、BEFORE/AFTER/INSTEAD OF)
Oracle PL/SQL Trigger複合トリガー(compound trigger)など拡張機能を独自実装

関連用語