PSQL Programmer's Guide (v11)

SQL トリガー

トリガーは、データベースに対して一貫性のある規則を強制するために、テーブルに定義されたアクションのことです。トリガーは、ユーザーがそのテーブルで SQL データ変更ステートメントを実行するときに、DBMS に対して実行するアクションが適切かどうか確認する辞書オブジェクトです。

トリガーを宣言するには、CREATE TRIGGER ステートメントを使用します。

CREATE TRIGGER CheckCourseLimit; 

トリガー名の最大サイズは 30 文字です。

トリガーを削除するには、DROP TRIGGER ステートメントを使用します。

DROP TRIGGER CheckCourseLimit; 

トリガーを直接呼び出すことはできません。トリガーは、関連するトリガーを持つテーブル上の INSERT、UPDATE または DELETE アクションの結果として呼び出されます。これらのステートメントの構文の詳細については、『SQL Engine Reference』で、以下のトピックを参照してください。

トリガーのタイミングと順序

トリガーは所定のイベントに対して自動的に実行するので、いつどのような順序でトリガーを実行するかを指定できることが大切です。トリガーを作成するときはその時機と順序を指定します。

トリガー アクションの時機の指定

トリガーに関連するイベントが発生すると、そのトリガーはイベントの前または後にトリガーを実行しなければなりません。たとえば、INSERT ステートメントがトリガーを呼び出した場合、トリガーは INSERT ステートメントの実行前または後に実行しなければなりません。

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); 

トリガー アクションの時機として BEFORE または AFTER を指定してください。トリガー アクションは、行ごとに 1 回実行します。BEFORE を指定すると、トリガーは行オペレーションの前に実行します。AFTER を指定すると、トリガーは行オペレーションの後に実行します。


メモ

Pervasive PSQL は、RI の制約を設定することによってはトリガーを呼び出しません。また、RI の制約によってシステムがテーブル上でカスケードされた削除を行う可能性もある場合、テーブルでは DELETE トリガーが定義されないことがあります。


トリガー順序の指定

イベントが同じ指定時機に複数のトリガーを呼び出す場合があります。たとえば、INSERT ステートメントは、その実行後に実行するよう定義された複数のトリガーを呼び出すことができます。これらのトリガーは同時に実行できないので、トリガーの実行順序を指定する必要があります。

以下の CREATE TRIGGER ステートメントが 1 番を指定しているので、テーブルに対して定義された以降の BEFORE INSERT トリガーはすべて 1 より大きい一意の番号を得なければなりません。

CREATE TRIGGER CheckCourseLimit
   BEFORE INSERT
   ON Enrolls
   ORDER 1 

符号なし整数で順序の値を指定しますが、この整数はそのテーブル、時間およびイベントに対して一意でなければなりません。現在の順序に新しいトリガーを追加する可能性がある場合は、これに適応できるように、番号に空きを残しておくようにします。

トリガーの順序を指定しないと、トリガーはそのテーブル、時間およびイベントに対して現在定義されているトリガーの順序の値よりも大きい一意の順序の値で作成されます。

トリガー アクションの定義

トリガーアクションは、行ごとに 1 回実行します。トリガー アクションの構文は以下のとおりです。

CREATE TRIGGER InsTrig 
   BEFORE INSERT ON Tuition 
   REFERENCING NEW AS Indata 
   FOR EACH ROW 
   INSERT INTO Tuitionidtable VALUES(Indata.ID); 

トリガー アクションに WHEN 句が含まれている場合、ブール式が真であれば、トリガーされた SQL ステートメントが実行します。式が真でなければ、トリガーされた SQL ステートメントは実行しません。WHEN 句が存在しないと、トリガーされた SQL ステートメントは無条件で実行します。

トリガーされた SQL ステートメントは、ストアド プロシージャ呼び出し(CALL procedure_name)などの単一の SQL ステートメントか、複合ステートメント(BEGIN...END)とすることができます。


メモ

トリガーのアクションはトリガーのタイトル テーブルを変更しないようにする必要があります。


トリガー アクションで、古い行イメージの列(DELETE または UPDATE の場合)または新規の行イメージの列(INSERT または UPDATE の場合)を参照しなければならない場合は、以下のようにトリガー宣言に REFERENCING 句を挿入する必要があります。

REFERENCING NEW AS N 

REFERENCING 句を使用して、トリガーによって変更されるデータの情報を保持できます。


SQL 制御ステートメント

データの管理