トリガーには、互いに排他的な2つのタイプがあります。 つまり、行トリガーと文トリガーの2つです。 1つのトリガー定義に、行操作と文操作を組み合わせて使用することはできません。
行トリガーおよび文トリガーのどちらもストアド プロシージャを呼び出すことができます(CREATE PROCEDUREおよびREPLACE PROCEDURE(外部形式)およびCREATE PROCEDUREおよびREPLACE PROCEDURE(SQL形式)を参照)。
以下の表に、行トリガーと文トリガーの主な違いをまとめます。
行トリガー | 文トリガー |
---|---|
トリガー文によって変更される行ごとに、1回起動します。 トリガー起動のプロセスには、WHEN条件がTRUEの値になるかどうかを検査し、指定の条件の評価がFALSEのときには起動しないという動作も含まれます。 行トリガーが起動する回数には制限がありません。 |
一度だけ起動します。 文トリガーは、変更された行にはアクセスできません。 |
トリガー文によって変更された行がない場合は起動しません。 | トリガー文によって変更された行がない場合でも起動します。 |
BEFOREトリガーとAFTERトリガーが可能です。 | AFTERトリガーだけが可能です。 |
REFERENCING句を使用した、任意のOLD値、NEW値または任意のOLD TABLE遷移テーブル、OLD_TABLE遷移テーブル、NEW TABLE遷移テーブルやNEW_TABLE遷移テーブルへのアクセスは、意味があります。 たとえば、OLD [ROW]遷移変数やOLD TABLE遷移テーブルを使用してINSERTを実行しても意味がありません。これは、以前に存在した変数やテーブルがないためです(有効な遷移変数およびテーブルと無効な遷移変数およびテーブルの完全なリストは、以下の表を参照)。 トリガーされるアクション文に対して有効な遷移の詳細は、以下の表を参照してください。 |
OLD遷移テーブルの名前とNEW遷移テーブルの名前のREFERENCINGオプションは使用できません。使用できるのは、OLD TABLE遷移テーブル、OLD_TABLE遷移テーブル、NEW TABLE遷移テーブルおよびNEW_TABLE遷移テーブルの名前のみです。 トリガーされるアクション文に対して有効な遷移の詳細は、以下の表を参照してください。 |
OLD_NEW_TABLE遷移テーブルは指定できません。 行トリガーにはOLD_NEW_TABLE遷移テーブルに相当するテーブルがありません。 |
OLD_NEW_TABLE遷移テーブルが指定できます。 |
行トリガーまたは文トリガーのどちらを使用してもアプリケーションを記述できる場合、文トリガーを使用すれば、ほとんどの場合、パフォーマンスが改善されます。それは、文トリガーが一度だけ起動するのに対して、同等の行トリガーはトリガー文が更新する各行につき一度ずつ起動するためです。
トリガーのタイプ、トリガー起動時間、更新操作および遷移変数と遷移テーブルの有効な組み合わせは、次の表のとおりです。
トリガーのタイプ | 起動時間 | 更新操作 | 有効な遷移 |
---|---|---|---|
ROW | BEFORE | DELETE | OLD [ROW] |
INSERT | NEW [ROW] | ||
MERGE INSERT | NEW [ROW] | ||
MERGE UPDATE |
|
||
UPDATE |
|
||
AFTER | DELETE |
|
|
INSERT |
|
||
MERGE INSERT |
|
||
MERGE UPDATE |
|
||
UPDATE |
|
||
STATEMENT | BEFORE | 適用なし。 BEFORE STATEMENTトリガーはANSI SQL:2011規格では定義されていません。また、Teradataでもサポートしていません。 サポートされていないトリガー機能を参照してください。 |
|
AFTER | DELETE |
|
|
INSERT |
|
||
MERGE INSERT |
|
||
MERGE UPDATE |
|
||
UPDATE |
|