データベーストリガは、特定のテーブルに対する操作(INSERT、UPDATE、DELETEなど)が発生した際に、自動的に実行される一連の操作のことです。これにより、データの整合性維持や操作履歴の記録など、様々なデータ管理タスクを自動化することができます。
トリガの種類
トリガは、大きく分けて「行トリガ」と「文トリガ」の2種類があります。
行トリガ
テーブル内の各行に対して、操作が行われるごとに実行されます。例えば、UPDATE文で複数の行が更新される場合、各行ごとにトリガが実行されます。
トリガ内では、変更前の行を`OLD`、変更後の行を`NEW`という擬似変数で参照できます。
文トリガ
SQL文(INSERT、UPDATE、DELETE)が実行された際に、一度だけ実行されます。例えば、UPDATE文で複数の行が更新されても、トリガは一度しか実行されません。
トリガの属性
トリガは以下の属性を持ち、実行タイミングや条件を細かく設定できます。
BEFORE / AFTER
トリガを、操作(SQL文)の実行前(BEFORE)に実行するか、実行後(AFTER)に実行するかを指定します。
INSTEAD OF
トリガを、元のSQL文の代わりに実行することを指定します。
WHEN
トリガを実行する条件を指定します。条件式が真の場合のみトリガが実行されます。
トリガの起動イベント
トリガは、主に以下の3つのイベントによって起動されます。
INSERT:新しい行が挿入されるとき。
UPDATE:既存の行が変更されるとき。また、`UPDATE OF`を指定することで特定の列が変更された場合にのみトリガを起動することも可能です。
DELETE:既存の行が削除されるとき。
トリガでは、SELECT文によるデータ取得に影響を与えることはできません。
主要データベース製品におけるトリガの実装
主要な
データベース製品では、それぞれトリガ機能が実装されており、製品ごとの特徴や構文があります。
Oracle Database
標準トリガに加え、スキーマレベルのトリガもサポートしています。スキーマの変更やユーザのログイン/ログオフに対するトリガを設定できます。
サポートされるイベント例
INSERT, UPDATE, DELETE
AFTER CREATE
BEFORE/AFTER ALTER
BEFORE/AFTER DROP
BEFORE LOGOFF / AFTER LOGON
標準トリガに加え、ビューに対する`INSTEAD OF`トリガを定義できます。また、
データ定義言語(DDL)トリガもサポートしています。
サポートされるイベント例
INSERT, UPDATE, DELETE
DROP TABLE
CREATE TABLE
ALTER TABLE
ログイン
バージョン6.2から標準トリガをサポートしています。
バージョン8.4で`TRUNCATE`イベント、9.0で`UPDATE OF`、`WHEN`句をサポートしました。
トリガ内で実行する処理は、関数として定義する必要があります。
サポートされるイベント例
INSERT
UPDATE / UPDATE OF
DELETE
TRUNCATE
文法例
sql
CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN (...) ] EXECUTE PROCEDURE funcname ( arguments )
バージョン5.0.2から標準トリガをサポートしています。
サポートされるイベント例
INSERT
UPDATE
DELETE
文法例
sql
CREATE TRIGGER salary_trigger
BEFORE UPDATE ON employee_table
REFERENCING NEW ROW AS n, OLD ROW AS o
FOR EACH ROW
IF n.salary <> o.salary THEN
...
END IF;
まとめ
データベーストリガは、データの整合性維持、操作履歴の記録、監査など、様々な目的で利用できる強力な機能です。各データベース製品におけるトリガの実装を理解し、適切に活用することで、より効率的かつ安全なデータベース運用を実現することができます。
外部リンク
Oracle CREATE TRIGGER
DB2 CREATE TRIGGER statement
Microsoft SQL Server CREATE TRIGGER / DROP TRIGGER
PostgreSQL CREATE TRIGGER
MySQL Database triggers