SQL 構文リファレンス : CREATE TRIGGER
 
このページをシェアする                  
CREATE TRIGGER
CREATE TRIGGER ステートメントにより、データベース内に新しいトリガーを作成します。トリガーとは、INSERTUPDATE、または DELETE によってテーブル内のデータが変更されるときに自動的に実行されるストアド プロシージャの一種です。
通常のストアド プロシージャとは違って、トリガーは直接実行できず、パラメーターを持つこともできません。また、トリガーは結果セットを返さず、トリガーをビューに定義することもできません。
構文
CREATE TRIGGER トリガー名 before/after 挿入/更新/削除 ON テーブル名
[ORDER 番号]
[REFERENCING 参照エイリアス] FOR EACH ROW
[WHEN プロシージャ検索条件] プロシージャ ステートメント
 
トリガー名 ::= ユーザー定義名
 
before/after ::= BEFORE | AFTER
 
挿入/更新/削除 ::= INSERT | UPDATE | DELETE
 
参照エイリアス ::= OLD [AS] 相関名 [NEW [AS] 相関名]
| NEW [AS] 相関名 [OLD [AS] 相関名]
 
相関名 ::= ユーザー定義名
備考
メモ: トリガー内では、変数名はコロン(:)で始まる必要があります。

OLD(OLD 相関名)と NEW(NEW 相関名)はトリガー内部で使用でき、通常のストアド プロシージャでは使用できません。
DELETE または UPDATE トリガーでは、"OLD" または OLD 相関名を列名の前に付加して、更新または削除操作の前にデータ行内の列を参照する必要があります。
INSERT または UPDATE トリガーでは、"NEW" または NEW 相関名を列名の前に付加して、挿入または更新しようとする行内の列を参照する必要があります。
トリガー名は辞書内で固有の名前でなければなりません。
トリガーはその種類によって、UPDATEINSERT、または DELETE ステートメントの実行の前か後に実行されます。
メモ: CREATE TRIGGER ステートメントには、CREATE PROCEDURE と同様の長さやそれ以外の制約があります。詳細については、制限およびデータ型の制限を参照してください。
次の例では、Tuition テーブルに挿入された新規の値を TuitionIDTable に記録するトリガーが作成されます。
CREATE TABLE Tuitionidtable (primary key(id), id ubigint)
CREATE TRIGGER InsTrig
BEFORE INSERT ON Tuition
REFERENCING NEW AS Indata
FOR EACH ROW
INSERT INTO Tuitionidtable VALUES(Indata.ID);
Tuition の INSERT によりトリガーが呼び出されます。
============ 
次の例では、トリガーを使って A と B の 2 つのテーブルの同期をとる方法を示します。両方のテーブルは同じ構造体を持ちます。
CREATE TABLE A (col1 INTEGER, col2 CHAR(10))
CREATE TABLE B (col1 INTEGER, col2 CHAR(10))
CREATE TRIGGER MyInsert
AFTER INSERT ON A FOR EACH ROW
INSERT INTO B VALUES (NEW.col1, NEW.col2);
CREATE TRIGGER MyDelete
AFTER DELETE ON A FOR EACH ROW
DELETE FROM B WHERE B.col1 = OLD.col1 AND B.col2 = OLD.col2;
CREATE TRIGGER MyUpdate
AFTER UPDATE ON A FOR EACH ROW
UPDATE B SET col1 = NEW.col1, col2 = NEW.col2
WHERE B.col1 = OLD.col1 AND B.col2 = OLD.col2;
この例の OLD と NEW は、テーブル A が位置付けでない SQL ステートメントで変更された場合のみテーブルの同期を保つので注意してください。SQLSetPos API または位置付けの UPDATE か DELETE を使用した場合は、テーブル A が重複するレコードを含まない場合のみテーブルの同期が保たれます。一方のレコードは変更するが、もう一方の重複するレコードは変更しないままにしておく SQL ステートメントは作成できません。
関連項目
DROP TRIGGER