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 ステートメントは作成できません。
関連項目