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