CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE func ( arguments )
CREATE TRIGGER は新しいトリガを現在のデータベースに登録します。そのトリガはリレーション table と関連づけられ指定された関数 func を実行します。
トリガは、タプルへの操作が開始される前(制約条件のチェックと INSERT、UPDATE または DELETE が行われる前)、あるいは操作が開始された後(制約条件がチェックされ INSERT、 UPDATE または DELETE が完了した後) の前後いずれでも起動を指定することができます。 イベントの前にトリガが起動すると、そのトリガは指定したタプルに対する操作を省略することも、(INSERT と UPDATE の操作時のみ) 挿入されたタプルを変更することもできます。 イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだ全ての変更がトリガに "可視"となります。
SELECT は行を全く変更しませんので、 SELECT トリガを作成することはできません。この場合は、ルールやビューの方がより適しています。
より詳細については、 PostgreSQL プログラマガイド のSPI と トリガの章を参照して下さい。
テーブルにトリガを作成するには、ユーザはそのテーブルに対し 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 をトリガによる動作として実行することができます。この制限は、これらのコマンドを実行するストアドプロシージャを作成することで簡単に解決することができます。