PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE TRIGGER

## 名前

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

## 概要

    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`トリガを作成することはできません。 この場合は、ルールやビューの方がより適しています。

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

## パラメータ

`name`

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

`BEFORE`
`AFTER`

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

`event`

  `INSERT`、`UPDATE`、`DELETE`のいずれかです。 これは、トリガを起動するイベントを指定するものです。 `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コマンドを使用してください。

## 例

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

## 互換性

PostgreSQLにおける`CREATE TRIGGER`文はSQL:1999標準のサブセットを実装したものです。 (SQL-92にはトリガについての規定はありません。) 次の機能が欠落しています。

- SQL:1999では、指定した列への更新時に起動するトリガが可能です。 (例えば、`AFTER UPDATE OF col1, col2`)

- SQL:1999では、"old"と"new"の別名や、トリガで起動される動作定義で使用されるテーブルに別名を定義することができます。 (例えば、`CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...`)。 PostgreSQLでは、トリガプロシージャを任意数のユーザ定義言語で作成することができますので、データへのアクセスは言語固有の方法で扱われます。

- PostgreSQLでは、トリガの動作として、ユーザ定義の関数を実行させることしかできません。 SQL:1999では、他のSQLコマンドを複数実行させることができます。 例えば、トリガ動作として`CREATE TABLE`を実行させることができます。 この制限を回避する方法は簡単で、実行させたいコマンドを実行するユーザ定義関数を作成することです。

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

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

## 関連項目

CREATE FUNCTION, ALTER TRIGGER, DROP TRIGGER

前のページ | ホーム | 次のページ
CREATE TABLESPACE | 上に戻る | CREATE TYPE