トリガを作成します。
Synopsis
CREATE TRIGGER name BEFORE event ORDER integer ON table REFERENCING alias action
CREATE TRIGGER name AFTER event ORDER integer ON table REFERENCING alias action
CREATE TRIGGER コマンドはトリガを作成します。トリガは、指定されたテーブルに新しい行が挿入されるなどのトリガ・イベントが発生したときに引き出されます。
トリガは一意にする必要があります。各トリガには一意の名前を指定する必要があり、そうでない場合は SQLCODE -365 が発行されます。各トリガには、トリガ・イベントのタイプ、順序、およびトリガ動作の一意の組み合わせを定義する必要があります。一意でない場合は、SQLCODE -364 が発行されます。
トリガの生成には、
GRANT コマンドで指定された %CREATE_TRIGGER 管理者特権が必要です。
トリガ名の名前付け規約は、テーブル名の名前付け規約と同じです。同じスキーマ内では、テーブルとトリガに同じ名前を使用できません。同じ名前にすると、SQLCODE 365 が返されます。
トリガ名は、
識別子 の規則に従い、以下のような制約を受けます。既定のトリガ名は、簡単な識別子です。トリガ名は 128 文字を超えることはできません。
Caché はトリガ名 (SQLNAME) を使用して、対応する Caché 識別子を生成します。Caché 識別子には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。この Caché 識別子名を生成するには、Caché は最初にトリガ名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、トリガ名の一意性を保証するために、必要に応じて最後の文字を数字に置き換えます。トリガの名前を付ける際には、この名前生成に伴う以下の制約について考慮する必要があります。
-
トリガ名には、最低でも 1 文字を含める必要があります。トリガ名の先頭の文字または最初の句読点に続く文字は、数字以外の文字にする必要があります。
-
Caché は Unicode システムで、16 ビット (ワイド) 文字のトリガ名をサポートします。
$ZNAME テストに合格した文字は、有効な文字です。
-
生成された Caché の名前には句読点が含まれないため、句読点のみが異なるトリガ名の作成は可能ですが、お勧めできません。
-
トリガ名は 25 文字よりも大幅に長くすることができますが、最初の 25 英数文字が異なるようにトリガ名を作成すると処理がはるかに容易になります。
INSERT として指定されたトリガは、指定されたテーブルに行が挿入されたときに引き出されます。DELETE として指定されたトリガは、指定されたテーブルから行が削除されたときに引き出されます。UPDATE として指定されたトリガは、指定されたテーブルの行が更新されたときに引き出されます。UPDATE OF として指定されたトリガは、指定されたテーブルの特定の行にある 1 つ以上の指定された列が更新されたときに引き出されます。列名は任意の順序で指定できますが、重複することはできません。UPDATE OF 節は、LANGUAGE が SQL の場合にのみ有効です。
ORDER 節は、2 つの AFTER DELETE トリガのように、1 つのテーブルに同じタイミングとイベントを持つトリガが複数あるときに、トリガが引き出される順番を決定します。ORDER を表す整数値が最小のトリガが最初に実行され、その後は、次に高い整数値を持つトリガが順次実行されます。ORDER 節が指定されない場合は、ORDER 値に 0 (ゼロ) を割り当ててトリガが生成されます。したがって、ORDER 節を持たないトリガは、必ず ORDER 節を持つトリガの前に実行されます。
複数のトリガに同じ ORDER 値を割り当てることができます。また、ORDER が 0 (明示的または暗黙的) のトリガを複数作成することもできます。タイミング、イベント、および順序が同じ複数のトリガは、任意の順序で一緒に実行されます。
以下の例は、ORDER 値がどのように機能するかを示します。以下のすべての CREATE TRIGGER 文は、同じイベントによって引き出されるトリガを作成します。
CREATE TRIGGER TrigA BEFORE DELETE ON doctable
INSERT INTO TLog VALUES ('doc deleted');
-- Assigned ORDER=0
CREATE TRIGGER TrigB BEFORE DELETE ORDER 4 ON doctable
INSERT INTO TReport VALUES ('doc deleted')
-- Specified as ORDER=4
CREATE TRIGGER TrigC BEFORE DELETE ORDER 2 ON doctable
INSERT INTO Ttemps VALUES ('doc deleted')
-- Specified as ORDER=2
CREATE TRIGGER TrigD BEFORE DELETE ON doctable
INSERT INTO Tflags VALUES ('doc deleted')
-- Also assigned ORDER=0
これらのトリガは、(TrigA または TrigD)、TrigC、TrigB の順に実行されます。TrigA と TrigD は同じ ORDER 値となるので、任意の順序で実行されます。
REFERENCING 節では、行の元の値、新しい値、またはその両方に対してエイリアスを指定できます。元の値とは、UPDATE または DELETE トリガのトリガ動作が実行される前の行の値のことです。新しい値とは、UPDATE または INSERT トリガのトリガ動作が実行された後の行の値のことです。UPDATE トリガの場合は、以下のようにして、元の行値と新しい値の両方にエイリアスを指定できます。
REFERENCING OLD ROW AS oldalias NEW ROW AS newalias
キーワードの ROW と AS は省略可能です。したがって、同じ節を以下のように指定することもできます。
REFERENCING OLD oldalias NEW newalias
INSERT 前の元の値や DELETE 後の新しい値を参照することには、意味がありません。それらを参照すると、SQLCODE -48 が返されます。
-
-
オプションの WHEN 節。WHEN 節は、WHEN キーワードとその後の括弧で囲まれた検索条件 (単純または複雑な) で構成されます。検索条件が TRUE に評価されると、トリガが実行されます。WHEN 節は、LANGUAGE が SQL の場合にのみ使用できます。
-
オプションの LANGUAGE 節。LANGUAGE SQL または LANGUAGE OBJECTSCRIPT を指定できます。既定は SQL です。
-
LANGUAGE SQL の場合、トリガ文は SQL プロシージャ・ブロックです。SQL プロシージャ・ブロックは、1 つの SQL プロシージャ文とその後のセミコロン、またはキーワード BEGIN で始まりキーワード END で終わる 1 つ以上の SQL プロシージャ文と各文の後のセミコロンからなります。
-
LANGUAGE OBJECTSCRIPT の場合、トリガ文は、中括弧で囲まれた 1 つ以上の Caché ObjectScript 文からなるブロックです。こうしたトリガ・コードでラベルを指定するには、ラベル行の先頭にコロンを付けて、その行が最初の列で始まることを示します。Caché はコロンを削除して、残りの行をラベルとして処理します。
Note:
ラベル用のコロン接頭語の使用は、
ホスト変数参照用のコロン接頭語の使用よりも優先します。この競合を回避するために、埋め込み SQL トリガ・コード行の先頭にホスト変数参照を決して記述しないことをお勧めします。トリガ・コード行の先頭にホスト変数参照を記述する必要がある場合は、二重のコロン接頭語を使用することで、それがホスト変数でありラベルでないことを明示してください。
トリガ動作はアトミックで、完全に適用されるかまったく適用されないかのどちらかです。これに COMMIT 文または ROLLBACK 文を含めることはできません。キーワード BEGIN ATOMIC は、キーワード BEGIN と同義です。
Caché ObjectScript で記述するトリガ・コードには、{
fieldname} で指定するフィールド参照を含めることができます。ここで、
fieldname は現在のテーブルの既存フィールドを指定します。中括弧内に空白スペースは許可されません。現在のフィールドは、{*} のようにアスタリスクを使用して指定できます。UPDATE トリガ・コードでは、
fieldname の後に *N、*O、または *C を続けることで、変更フィールドのデータ値の処理方法を指定できます。{
fieldname*N} は、指定された変更が実行された後の新しいフィールド値を返します。これが既定です。{
fieldname*O} は、指定された変更が実行される前の元のフィールド値を返します。{
fieldname*C} は、フィールド値が変更されたかどうかを示すブーリアン値 (変更の場合は 1、未変更の場合は 0) を返します。
また、Caché ObjectScript で記述するトリガ・コードには、擬似フィールド参照変数の {%%CLASSNAME}、{%%CLASSNAMEQ}、{%%TABLENAME}、および {%%ID} を含めることもできます。擬似フィールドは、クラスのコンパイル時に特定の値に変換されます。{%%CLASSNAME} と {%%CLASSNAMEQ} は、ともに SQL テーブル定義を投影するクラスの名前に変換されます。{%%CLASSNAME} は引用符なし文字列を返し、{%%CLASSNAMEQ} は引用符付き文字列を返します。{%%TABLENAME} はテーブルの完全修飾名に変換され、引用符付き文字列を返します。{%%ID} は RowID 名に変換されます。この参照は、RowID フィールドの名前がわからないときに有用です。これらの擬似フィールド・キーワードは、すべて大文字と小文字を区別しません。
SET %msql="_SYSTEM"
&sql(CREATE TABLE TestDummy (
TESTNUM INT NOT NULL,
FIRSTWORD CHAR (30) NOT NULL,
LASTWORD CHAR (30) NOT NULL,
CONSTRAINT TestDummyPK PRIMARY KEY (TESTNUM))
)
WRITE !,"SQL table code is: ",SQLCODE
&sql(CREATE TRIGGER TestDummy AFTER INSERT ON TestDummy
BEGIN
INSERT INTO LogFile VALUES ('INSERT into TestDummy');
END)
WRITE !,"SQL trigger code is: ",SQLCODE
CREATE TRIGGER Trigger_1 AFTER INSERT ON Table_1
REFERENCING NEW ROW AS new_row
BEGIN
INSERT INTO Log_Table VALUES ('INSERT into Table_1');
INSERT INTO New_Log_Table VALUES
('INSERT into Table_1', new_row.ID);
END
CREATE TRIGGER Trigger_2 AFTER INSERT ON Table_1
REFERENCING NEW ROW AS new_row
BEGIN
INSERT INTO Log_Table VALUES (new_row.Category);
END