CREATE TRIGGER

名前

CREATE TRIGGER -- 新しいトリガを定義する

概要

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

説明

CREATE TRIGGERは新しいトリガを作成します。 作成したトリガは指定したテーブルと関連付けられ、特定のイベントが発生した時に指定した関数funcnameを実行します。

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

FOR EACH ROW付きのトリガは、その操作によって変更される行ごとに1回ずつ呼び出されます。 例えば、10行に影響を与えるDELETE操作は、対象リレーション上のON DELETEトリガを、行が削除される度に1回ずつ、個別に10回呼び出すことになります。 反対に、FOR EACH STATEMENT付きのトリガは、その操作によって何行変更されたかにかかわらず、任意の操作ごとに1回のみ実行されます (変更対象が0行となる操作でも、適用できるFOR EACH STATEMENTトリガがあれば実行されます)。

同一イベントに同じ種類の複数のトリガが定義された場合、名前のアルファベット順で実行されます。

SELECTはまったく行を変更しないため、SELECTトリガを作成することはできません。 この場合は、ルールやビューの方が適しています。

トリガに関するより詳細については、第34章を参照してください。

パラメータ

name

新しいトリガに付与する名前です。 同じテーブルの他のトリガと異なる名前にする必要があります。

BEFORE
AFTER

関数の呼び出しをイベントの前に行うか後に行うかを決定します。

event

INSERTUPDATEDELETEのいずれかが入ります。 このパラメータは、トリガを起動するイベントを指定します。 ORを使用して、複数のイベントを指定することができます。

table

トリガを作成するテーブルの名前です(スキーマ修飾名も可)。

FOR EACH ROW
FOR EACH STATEMENT

このパラメータは、トリガプロシージャを、トリガイベントによって影響を受ける行ごとに1回起動するか、SQL文ごとに1回のみ起動するかを指定します。 どちらも指定されない場合は、FOR EACH STATEMENTがデフォルトです。

funcname

ユーザが提供する関数です。この関数は、引数を取らずtrigger型を返すよう定義します。トリガが起動した時に実行されます。

arguments

トリガ実行時に関数に渡される引数をカンマで区切ったリストです。このパラメータは省略可能です。 引数として指定するのは、リテラル文字列定数です。 単純な名前および数値定数を記述できますが、全て文字列に変換されます。 関数内でこのトリガ引数にアクセスする方法については、トリガ関数を実装した言語の説明を参照してください。 通常の関数引数とは異なる場合があります。

注釈

テーブルにトリガを作成するには、ユーザがそのテーブルに対しTRIGGER権限を持っている必要があります。

PostgreSQL 7.3より前のバージョンでは、トリガ関数の戻り値の型を、trigger型ではなくプレースホルダであるopaque型として宣言する必要がありました。 古いダンプファイルのロードをサポートするため、CREATE TRIGGERではopaque型を返すよう宣言された関数を受け入れます。 しかし、注意を促すメッセージを表示し、宣言された関数の戻り値型をtriggerに変換します。

トリガを削除するには、DROP TRIGGERコマンドを使用してください。

項34.4に完全な例があります。

互換性

PostgreSQLにおけるCREATE TRIGGER文は標準SQLのサブセットを実装したものです ただし、PostgreSQLには、次の機能がありません。

SQLでは、複数のトリガは、作成時刻順に起動すべきであると規定しています。 PostgreSQLでは名前順であり、より簡単に判断することができます。

SQLでは、数珠繋ぎの削除に対するBEFORE DELETEは、数珠繋ぎのDELETEが完了した後に発行するものと規定しています。 PostgreSQLでは、BEFORE DELETEは常に削除操作よりも後に行われます。 この方がより一貫性があると考えています。 また、参照性合成に関する操作によって後で変更される行をBEFOREトリガが変更する時の振舞いは予測できません。 これは、制約違反となるかもしれませんし、参照性合成制約に合わないデータを格納してしまうかもしれません。

ORを使用して単一トリガに複数の動作を指定する機能は、標準SQLに対するPostgreSQLの拡張です。

関連項目

CREATE FUNCTION, ALTER TRIGGER, DROP TRIGGER