[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 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

37.1. イベントトリガ動作の概要

イベントトリガは、関連づけられたイベントが、定義されたデータベースで起こるたびに実行されます。現在の所サポートされているイベントは、ddl_command_startddl_command_endsql_dropです。 今後のリリースで新たなイベントが追加されるかもしれません。

ddl_command_startイベントは、CREATEALTERDROPコマンドの実行の前に発生します。影響するオブジェクトが存在するかどうかのチェックはイベントトリガが実行されるまで行われません。 しかしながら例外として、共有オブジェクト — データベース、ロール、テーブルスペース — を対象としているDDLコマンド、もしくは、イベントトリガ自体をターゲットにしたコマンドにに対してのイベントは起こりません。 ddl_command_startはまた、 SELECT INTOコマンドの実行後にも発生します。このコマンドはCREATE TABLE ASコマンドと同等だからです。

ddl_command_endイベントは、ddl_command_startイベントが対象とする同様のコマンドの実行後に発生します。

sql_dropイベントは、データベースオブジェクトを削除する命令に対するddl_command_endイベントトリガの直前に発生します。削除されたオブジェクトを一覧として出力するために、sql_dropイベントトリガコード(項9.28を参照してください)からpg_event_trigger_dropped_objects()という集合を返す関数を使用します。トリガはオブジェクトがシステムカタログから削除された後に実行されるため、以後、そのオブジェクトを見ることができないことに注意してください。

イベントトリガは(他の関数のように)中断したトランザクションでは実行されません。従って、DDLコマンドがエラーで失敗した場合、関連するddl_command_endトリガは実行されません。逆に、もしddl_command_startトリガがエラーで失敗した場合、他のイベントトリガは起動されず、コマンド自体も事項されません。同様に、もしddl_command_endトリガがエラーで失敗した場合、それ を含むトランザクションが失敗した場合のようにDDL文はロールバックされます。

イベントトリガでサポートされているコマンドの一覧は、項37.2を参照してください。

イベントトリガを作成するために、まず特別な型event_triggerを返す関数を作る必要があります。この関数は値を返す必要はありません。というのも、その戻り値型は単にシグナルとして、その関数がイベントトリガを呼び出していること示しているだけだからです。

特定のイベントに対して複数のイベントトリガが定義された場合、トリガ名のアルファベット順で起動されます。

トリガ定義はWHEN条件で特定されます。そのため、例えばddl_command_startトリガはユーザが望む特定のコマンドのみを契機に実行させることができます。このようなトリガの一般的な使い方として、ユーザが実行するかもしれないDDL文の範囲を狭めることができます。