他のバージョンの文書 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

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

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

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

ddl_command_endイベントは、ddl_command_startイベントが対象とする同様のコマンドの実行後に発生します。 発生したDDL操作のより詳細を取得するには、ddl_command_endイベントトリガコード(9.29を参照してください)で集合を返す関数pg_event_trigger_ddl_commands()を使ってください。 トリガはアクションが起きた後(ただし、トランザクションのコミットの前)に起動し、システムカタログは既に変更されたものとして読まれることに注意してください。

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

コマンドALTER TABLEALTER TYPEのアクションによりテーブルが書き換えられる直前に、table_rewriteイベントは発生します。 CLUSTERVACUUMのような他の制御文でもテーブルを書き換えられますが、それらではtable_rewriteイベントは引き起こされません。

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

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

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

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

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