CREATE TRIGGER
CREATE TRIGGER ステートメントにより、データベース内に新しいトリガーを作成します。トリガーとは、
INSERT
、
UPDATE
、または
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
相関名
を列名の前に付加して、挿入または更新しようとする行内の列を参照する必要があります。
トリガー名は辞書内で固有の名前でなければなりません。
トリガーはその種類によって、
UPDATE
、
INSERT
、または
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