トリガを作成します。
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
引数
name 作成するトリガの名前。 識別子 です。トリガ名は修飾、未修飾のどちらでもかまいません。修飾する場合は、対象テーブルと同じスキーマを指定する必要があります。
BEFORE event
AFTER event
トリガ・イベントのタイプ利用可能なオプションは、INSERT、DELETE、UPDATE です。UPDATE キーワードはオプションで OF とコンマで区切られた列名リストが続く場合もあります。UPDATE OF 節は、LANGUAGE が SQL の場合にのみ指定できます。
ORDER integer オプション — 同時に同じイベントでテーブルに複数のトリガが存在する場合にトリガが引き出される順番。順番の指定を省略したトリガには、順番 0 が割り当てられます。
ON table トリガが作成されるテーブル。テーブル名は修飾、未修飾のどちらでもかまいません。修飾する場合は、トリガが、そのトリガを使用するテーブルと同じスキーマにある必要があります。
REFERENCING OLD ROW AS alias
REFERENCING NEW ROW AS alias
オプション — REFERENCING OLD ROW を指定すると、UPDATE または DELETE トリガの実行中に、列の元の値を参照できます。REFERENCING NEW ROW を指定すると、INSERT または UPDATE トリガの実行中に、列の新しい値を参照できます。REFERENCING 節は、LANGUAGE が SQL の場合にのみ使用できます。
action トリガのプログラム・コード。LANGUAGE SQL または LANGUAGE OBJECTSCRIPT (Caché ObjectScript) キーワード節を使用して、action の先頭にプログラム言語を指定します。LANGUAGE 節が省略される場合、SQL は既定です。
概要
CREATE TRIGGER コマンドはトリガを作成します。トリガは、指定されたテーブルに新しい行が挿入されるなどのトリガ・イベントが発生したときに引き出されます。
トリガは一意にする必要があります。各トリガには一意の名前を指定する必要があり、そうでない場合は SQLCODE -365 が発行されます。各トリガには、トリガ・イベントのタイプ、順序、およびトリガ動作の一意の組み合わせを定義する必要があります。一意でない場合は、SQLCODE -364 が発行されます。
トリガの生成には、GRANT コマンドで指定された %CREATE_TRIGGER 管理者特権が必要です。
引数
name
トリガ名の名前付け規約は、テーブル名の名前付け規約と同じです。同じスキーマ内では、テーブルとトリガに同じ名前を使用できません。同じ名前にすると、SQLCODE –365 が返されます。
トリガ名は、識別子 の規則に従い、以下のような制約を受けます。既定のトリガ名は、簡単な識別子です。トリガ名は 128 文字を超えることはできません。
Caché はトリガ名 (SQLNAME) を使用して、対応する Caché 識別子を生成します。Caché 識別子には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。この Caché 識別子名を生成するには、Caché は最初にトリガ名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、トリガ名の一意性を保証するために、必要に応じて最後の文字を数字に置き換えます。トリガの名前を付ける際には、この名前生成に伴う以下の制約について考慮する必要があります。
event
INSERT として指定されたトリガは、指定されたテーブルに行が挿入されたときに引き出されます。DELETE として指定されたトリガは、指定されたテーブルから行が削除されたときに引き出されます。UPDATE として指定されたトリガは、指定されたテーブルの行が更新されたときに引き出されます。UPDATE OF として指定されたトリガは、指定されたテーブルの特定の行にある 1 つ以上の指定された列が更新されたときに引き出されます。列名は任意の順序で指定できますが、重複することはできません。UPDATE OF 節は、LANGUAGE が SQL の場合にのみ有効です。
ORDER
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
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 が返されます。
action
トリガ動作は、以下の要素から構成されます。
トリガ動作はアトミックで、完全に適用されるかまったく適用されないかのどちらかです。これに 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 フィールドの名前がわからないときに有用です。これらの擬似フィールド・キーワードは、すべて大文字と小文字を区別しません。
以下の例は、SQL 挿入トリガを作成します。
   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
関連項目
トリガ動作 DROP TRIGGER