データベーストリガ

データベーストリガは、表に対するイベントに反応して自動的に実行される操作を意味する。トリガはデータ操作言語によるデータ状態の管理を自動化するために用いられる。トリガを利用することで、データ操作の限定、操作の記録、変更操作の監査などを行うことができる。

 トリガの種類 
トリガには大きく分けて「行トリガ」と「文トリガ」の2つの種類がある。
 行トリガ
 表の中の影響を受けた行それぞれに対して実行される。変更前または変更後の行は OLD, NEW という擬似的な行変数を使って読み取ることができる。
 文トリガ
 INSERT, UPDATE, DELETE 文に対して一度だけ実行される。

また、トリガは以下の属性を持つ。
 "BEFORE" または "AFTER"
 トリガが実行されるタイミングを指定する。
 "INSTEAD OF"
 トリガを元の文の代わりに実行する。
 "WHEN"
 トリガを起動する条件式を指定する。

一般的に、トリガは以下の3つのイベントにより起動される。トリガでは SELECT 文によるデータ取得に影響を及ぼすことはできない。
 INSERT (新しい行の挿入)
 UPDATE (既存の行の変更) / UPDATE OF (既存の行の特定の列の変更) 
 DELETE (既存の行の削除)

 Oracle のトリガ 
Oracle Database では標準のトリガの他、Oracle 9i にて「スキーマレベルトリガ」と呼ばれる、スキーマの変更やユーザのログイン／ログオフに対するトリガが追加された。

 INSERT
 UPDATE
 DELETE
 AFTER CREATE
 BEFORE/AFTER ALTER
 BEFORE/AFTER DROP
 BEFORE LOGOFF / AFTER LOGON

 Microsoft SQL Server のトリガ 
Microsoft SQL Server では標準のトリガの他、ビューに対して INSTEAD OF トリガを定義できる。また、Microsoft SQL Server 2005 にて データ定義言語 (DDL) トリガが追加された。
Microsoft SQL ServerのDDLトリガーで利用可能な全ての発動イベントのリストは、Microsoft Docsで入手可能である。

 INSERT
 UPDATE
 DELETE
 DROP TABLE
 CREATE TABLE
 ALTER TABLE
 ログイン

 PostgreSQL のトリガ 
PostgreSQL はバージョン 6.2 (1997年) から標準トリガがサポートされている。さらにバージョン 8.4 で TRUNCATE イベント、9.0 で UPDATE OF, WHEN 句をサポートした。
 INSERT
 UPDATE / UPDATE OF
 DELETE
 TRUNCATE

10.0 で REFERENCING TABLE 句をサポートした。

11.0 で EXECUTE FUNCTION 句をサポートした。

14.0 で OR REPLACE 句をサポートした。

トリガにて実行される処理は直接記述せず、関数として与える。

文法：
 CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
     ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
     [ WHEN (...) ] EXECUTE PROCEDURE funcname ( arguments )

 MySQL のトリガ 
MySQL はバージョン 5.0.2 にて標準トリガがサポートされた。
 INSERT
 UPDATE
 DELETE

文法：
 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;

 SQLite のトリガ 
SQLite は、文トリガーではなく、行トリガーのみをサポートする。
SQLite ではサポートされていない更新可能なビューは、INSTEAD OF トリガーを使用してエミュレートできる。

文法：
 CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS][database_name .] trigger_name
 [BEFORE | AFTER | INSTEAD OF] {DELETE | INSERT | UPDATE  [OF column_name [, column_name]...]}
 ON {table_name | view_name}
    [FOR EACH ROW] [WHEN condition is mandatory ]
 BEGIN
    ...
 END

 脚注 

 外部リンク 
Oracle CREATE TRIGGER
DB2 CREATE TRIGGER statement
Microsoft SQL Server CREATE TRIGGER / DROP TRIGGER
PostgreSQL CREATE TRIGGER
MySQL Database triggers

Category:データベース