★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

CREATE TRIGGER

Name

CREATE TRIGGER  --  新しいトリガの定義

Synopsis

CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }
    ON table FOR EACH { ROW | STATEMENT }
    EXECUTE PROCEDURE func ( arguments )

入力

name

新しいトリガに付与する名前です。

table

既存のテーブルの名前です。

event

INSERT、 DELETE または UPDATE のどれかです。

func

ユーザが提供する関数です。

出力

CREATE

トリガの作成に成功した場合に返されるメッセージです。

説明

CREATE TRIGGER は新しいトリガを現在のデータベースに登録します。そのトリガはリレーション table と関連づけられ指定された関数 func を実行します。

トリガは、タプルへの操作が開始される前(制約条件のチェックと INSERTUPDATE または DELETE が行われる前)、あるいは操作が開始された後(制約条件がチェックされ INSERTUPDATE または DELETE が完了した後) の前後いずれでも起動を指定することができます。 イベントの前にトリガが起動すると、そのトリガは指定したタプルに対する操作を省略することも、(INSERTUPDATE の操作時のみ) 挿入されたタプルを変更することもできます。 イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだ全ての変更がトリガに "可視"となります。

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

SQL92 には CREATE TRIGGER はありません。

SQL99

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 をトリガによる動作として実行することができます。この制限は、これらのコマンドを実行するストアドプロシージャを作成することで簡単に解決することができます。

関連項目

CREATE FUNCTION, DROP TRIGGER