イベントトリガは、関連づけられたイベントが、定義されたデータベースで起こるたびに実行されます。
今のところサポートされているイベントは、login、ddl_command_start、ddl_command_end、table_rewrite、sql_dropです。
今後のリリースで新たなイベントが追加されるかもしれません。
loginイベントは、認証されたユーザがシステムにログインするときに発生します。
このイベントのトリガプロシージャにおけるバグは、システムへのログインの成功を妨げる可能性があります。
このようなバグは、接続文字列または設定ファイルでevent_triggersをfalseに設定することで回避できます。
あるいは、シングルユーザモードでシステムを再起動することでも回避できます(このモードではイベントトリガが無効になっているため)。
シングルユーザモードの使用方法の詳細については、postgresのリファレンスページを参照してください。
loginイベントはスタンバイサーバでも実行されます。
サーバがアクセスできなくなるのを防ぐために、このようなトリガは、スタンバイで実行されているときにはデータベースに何も書き込まないようにする必要があります。
また、loginイベントトリガでの長時間実行する問い合わせは避けることをお勧めします。
例えば、psqlで接続を取り消しても進行中のloginトリガを中断しないことに注意してください。
ddl_command_startイベントは、CREATE、ALTER、DROP、SECURITY LABEL、COMMENT、GRANT、REVOKEコマンドの実行の直前に発生します。
影響するオブジェクトが存在するかどうかのチェックはイベントトリガが実行されるまで行われません。
しかしながら例外として、共有オブジェクト — データベース、ロール、テーブル空間 — を対象としているDDLコマンド、もしくは、イベントトリガ自体をターゲットにしたコマンドに対してのイベントは起こりません。
ddl_command_startはまた、SELECT INTOコマンドの実行直前にも発生します。このコマンドはCREATE TABLE ASコマンドと同等だからです。
ddl_command_endイベントは、ddl_command_startイベントが対象とする同様のコマンドの実行後に発生します。
発生したDDL操作のより詳細を取得するには、ddl_command_endイベントトリガコード(9.30を参照してください)で集合を返す関数pg_event_trigger_ddl_commands()を使ってください。
トリガはアクションが起きた後(ただし、トランザクションのコミットの前)に起動し、システムカタログは既に変更されたものとして読まれることに注意してください。
sql_dropイベントは、データベースオブジェクトを削除する命令に対するddl_command_endイベントトリガの直前に発生します。
削除されたオブジェクトを一覧として出力するために、sql_dropイベントトリガコード(9.30を参照してください)からpg_event_trigger_dropped_objects()という集合を返す関数を使用します。
トリガはオブジェクトがシステムカタログから削除された後に実行されるため、以後、そのオブジェクトを見ることができないことに注意してください。
コマンドALTER TABLEやALTER TYPEのアクションによりテーブルが書き換えられる直前に、table_rewriteイベントは発生します。
CLUSTERやVACUUMのような他の制御文でもテーブルを書き換えられますが、それらではtable_rewriteイベントは引き起こされません。
書き換えられたテーブルのOIDを見つけるには、関数pg_event_trigger_table_rewrite_oid()(9.30を参照)を使用します。
書き換えられた理由を知るには、関数pg_event_trigger_table_rewrite_reason()を使用します。
イベントトリガは(他の関数のように)中断したトランザクションでは実行されません。
従って、DDLコマンドがエラーで失敗した場合、関連するddl_command_endトリガは実行されません。
逆に、もしddl_command_startトリガがエラーで失敗した場合、他のイベントトリガは起動されず、コマンド自体も実行されません。
同様に、もしddl_command_endトリガがエラーで失敗した場合、それを含むトランザクションが失敗した場合のようにDDL文はロールバックされます。
イベントトリガでサポートされているコマンドの一覧は、38.2を参照してください。
イベントトリガは、コマンドCREATE EVENT TRIGGERを使用して作成されます。
イベントトリガを作成するために、まず特別な型event_triggerを返す関数を作る必要があります。
この関数は値を返す必要はありません。というのも、その戻り値型は単にシグナルとして、その関数がイベントトリガを呼び出していることを示しているだけだからです。
特定のイベントに対して複数のイベントトリガが定義された場合、トリガ名のアルファベット順で起動されます。
トリガ定義はWHEN条件で特定されます。そのため、例えばddl_command_startトリガはユーザが望む特定のコマンドのみを契機に実行させることができます。
このようなトリガの一般的な使い方として、ユーザが実行するかもしれないDDL文の範囲を狭めることができます。