トリガー とりがー
自動実行イベント駆動ストアドプロシージャデータ整合性監査ログSQL
トリガーについて教えて
トリガーとは
トリガー(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) |
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)など拡張機能を独自実装 |
関連用語
- ストアドプロシージャ — DB内部に保存しておく手続き型プログラム
- ビュー — 複雑なSELECTクエリに名前をつけて仮想テーブルとして扱う機能
- トランザクション — 一連のDB操作をひとまとめに扱う仕組み
- 制約 — テーブルのデータに課すルール(NOT NULL・UNIQUE・外部キー等)
- インデックス — 検索を高速化するための索引構造
- マテリアライズドビュー — クエリ結果を実体として保存する高速化技術
- レプリケーション — データを複数サーバーに複製して可用性を高める仕組み