CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE func ( arguments )
新しいトリガに付与する名前です。 この名前は、同じテーブルの他のトリガとは異なる名前にする必要があります。
INSERT、 DELETE または UPDATE のどれかです。
トリガを作成するテーブルの名前です (スキーマ修飾名でも可)。
引数を持たず、trigger 型を返すよう宣言された、ユーザが提供する関数です。
トリガ実行時に、新旧のタプル内容のような標準トリガデータとともに関数に渡される、複数の引数をコンマで区切ったリストです (省略可能)。 引数は、リテラル文字列定数です。 単純な名前および数値定数もここに記述できますが、すべて文字列に変換されます。
CREATE TRIGGER は新しいトリガを現在のデータベースに登録します。そのトリガはリレーション table と関連づけられ指定された関数 funcを実行します。
トリガは、タプルへの操作が開始される前(制約条件のチェックと INSERT、UPDATE または DELETE が行われる前)、あるいは操作が開始された後(制約条件がチェックされ INSERT、UPDATE または DELETE が完了した後) の前後いずれでも起動を指定することができます。イベントの前にトリガが起動すると、そのトリガは指定したタプルに対する操作を省略することも、(INSERT と UPDATE の操作時のみ) 挿入されたタプルを変更することもできます。イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだ全ての変更がトリガに"可視"となります。
同じ種類の複数のトリガが同一イベントに定義された場合、名前のアルファベット順で実行されます。
SELECT は行を全く変更しませんので、SELECT トリガを作成することはできません。この場合は、ルールやビューの方がより適しています。
より詳細については、PostgreSQL プログラマガイド の SPI と トリガの章を参照して下さい。
テーブルにトリガを作成するには、ユーザはそのテーブルに対し TRIGGER 権限を持つ必要があります。
PostgreSQL 7.3 より前のバージョンでは、トリガ関数を trigger 型ではなくプレースホルダ型 opaque 型を返すように宣言する必要がありました。 古いダンプファイルのロードをサポートするため、CREATE TRIGGER では opaque 型を返すよう宣言された関数を受け入れます。しかし、NOTICE を発行し、宣言された関数の戻り値型を trigger に変換します。
現在のリリースでは STATEMENT トリガは実装されていません。
トリガの削除方法については、DROP TRIGGER コマンドを参照して下さい。
指定された distributor のコードが distributors テーブルに存在するかどうか、 films テーブルに行を追加または更新する前に検査します。
CREATE TRIGGER if_dist_exists BEFORE INSERT OR UPDATE ON films FOR EACH ROW EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
distributor を消去するかまたはそのコードを変更する前に、 films テーブルに対する全ての参照を削除します。
CREATE TRIGGER if_film_exists BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');
2 番目の例は、以下のように外部キー制約を使用して実現することもできます。
CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40), CONSTRAINT if_film_exists FOREIGN KEY(did) REFERENCES films ON UPDATE CASCADE ON DELETE CASCADE );
SQL92 には CREATE TRIGGER はありません。
PostgreSQL における CREATE TRIGGER 文は SQL99 標準の一部を実装します。以下の機能は実装されていません。
SQL99 では、特定の列への更新に対してトリガを発行できます。 (例えば、AFTER UPDATE OF col1, col2)
SQL99 では、トリガ動作の定義にて使用される "old"および"new"行やテーブルに別名を定義することができます。 (例えば CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)PostgreSQL では、トリガ関数を複数のユーザ定義の言語で作成することができますので、データへのアクセス方法は言語独自の方法で取り扱われます。
PostgreSQL では文レベルのトリガはなく、行レベルのトリガのみ存在します。
PostgreSQL では、トリガによる動作としてストアドプロシージャしか実行できません。SQL99 では、複数の SQL コマンド、例えば、CREATE TABLE をトリガによる動作として実行することができます。この制限は、これらのコマンドを実行するストアドプロシージャを作成することで簡単に解決することができます。
SQL99 では、トリガが複数ある場合は作成時間順に実行するように指定されています。 それに対し、PostgreSQL では名前順で実行します。名前順の方が作業しやすいと判断したためです。