CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE funcname ( arguments )
CREATE TRIGGER は新しいトリガを作成します。 そのトリガは指定したテーブルと関連づけられ、特定のイベントが発生した時に指定した関数funcnameを実行します。
トリガは、行への操作が開始される前(制約条件のチェックと INSERT、UPDATE または DELETE が行われる前)、あるいは、操作が完了した後(制約条件がチェックされ INSERT、UPDATE または DELETE が完了した後)のいずれでも起動を指定することができます。 イベントの前にトリガが起動すると、そのトリガは対象行に対する操作を省略することも、(INSERT と UPDATE の操作時のみ) 挿入された行を変更することもできます。 イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだ全ての変更がトリガに"可視"となります。
FOR EACH ROW 付きのトリガは、その操作によって変更される行毎に1回呼び出されます。 例えば、10行に影響を与えるDELETE操作は、対象リレーション上の ON DELETE トリガを、行が削除される度に1回ずつ、独立して10回呼び出すことになります。 反対に、FOR EACH STATEMENT 付きのトリガは、その操作によって何行変更されたかに関わらず、任意の操作毎に1回のみ実行されます。 (特に、0行を変更する操作でも、適用すべきFOR EACH STATEMENT トリガを実行します。)
同じ種類の複数のトリガが同一イベントに定義された場合、名前のアルファベット順で実行されます。
SELECT は行を全く変更しませんので、SELECT トリガを作成することはできません。 この場合は、ルールやビューの方がより適しています。
トリガに関するより詳細については、第35章を参照して下さい。
新しいトリガに付与する名前です。 この名前は、同じテーブルの他のトリガとは異なる名前にする必要があります。
関数の呼び出しをイベントの前に行うか後に行うかを決定します。
INSERT、UPDATE、DELETE のいずれかです。 これは、トリガを起動するイベントを指定するものです。 OR を使用して、複数のイベントを指定することができます。
トリガを作成するテーブルの名前です (スキーマ修飾名でも可)。
これは、トリガプロシージャの起動を、トリガイベントによって影響を受ける行毎に1回行うか、SQL文毎に1回のみ行うかを指定します。 どちらも指定されない場合は、FOR EACH STATEMENT がデフォルトです。
引数をとらず、trigger型を返す、ユーザが提供する関数であり、トリガが起動した時に実行されます。
トリガ実行時に関数に渡される引数をコンマで区切ったリストです (省略可能)。 引数は、リテラル文字列定数です。 単純な名前および数値定数もここに記述できますが、すべて文字列に変換されます。 関数内でどのようにこのトリガ引数にアクセスするかについては、トリガ関数を実装した言語の説明を参照してください。 これは、通常の関数引数とは異なる場合があります。
テーブルにトリガを作成するには、ユーザはそのテーブルに対し TRIGGER 権限を持つ必要があります。
PostgreSQL 7.3 より前のバージョンでは、トリガ関数を trigger 型ではなくプレースホルダ型 opaque 型を返すように宣言する必要がありました。 古いダンプファイルのロードをサポートするため、CREATE TRIGGER では opaque 型を返すよう宣言された関数を受け入れます。 しかし、注意を促すメッセージを表示し、宣言された関数の戻り値型を trigger に変換します。
トリガを削除するには、DROP TRIGGER コマンドを使用してください。
PostgreSQL におけるCREATE TRIGGER文はSQL99標準のサブセットを実装したものです。 (SQL92にはトリガについての規定はありません。) 次の機能が欠落しています。
SQL99では、指定した列への更新時に起動するトリガが可能です。 (例えば、AFTER UPDATE OF col1, col2)
SQL99では、"old"と "new" の別名や、トリガで起動される動作定義で使用されるテーブルに別名を定義することができます。 (例えば、CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)。 PostgreSQL では、トリガプロシージャを任意数のユーザ定義言語で作成することができますので、データへのアクセスは言語固有の方法で扱われます。
PostgreSQL では、トリガの動作として、ユーザ定義の関数を実行させることしかできません。 SQL99では、他のSQLコマンドを複数実行させることができます。例えば、トリガ動作としてCREATE TABLEを実行させることができます。 この制限を回避する方法は簡単で、実行させたいコマンドを実行するユーザ定義関数を作成することです。
SQL99では、複数のトリガは、作成時刻順に起動すべきであると規定しています。 PostgreSQLでは名前順であり、その動作の判断がより簡単になっています。
ORを使用した単一トリガにおける複数の動作指定機能は、標準SQLに対する PostgreSQLの拡張です。