イベントトリガは、関連づけられたイベントが、定義されたデータベースで起こるたびに実行されます。
今のところサポートされているイベントは、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
イベントは引き起こされません。
イベントトリガは(他の関数のように)中断したトランザクションでは実行されません。
従って、DDLコマンドがエラーで失敗した場合、関連するddl_command_end
トリガは実行されません。
逆に、もしddl_command_start
トリガがエラーで失敗した場合、他のイベントトリガは起動されず、コマンド自体も実行されません。
同様に、もしddl_command_end
トリガがエラーで失敗した場合、それを含むトランザクションが失敗した場合のようにDDL文はロールバックされます。
イベントトリガでサポートされているコマンドの一覧は、38.2を参照してください。
イベントトリガは、コマンドCREATE EVENT TRIGGERを使用して作成されます。
イベントトリガを作成するために、まず特別な型event_trigger
を返す関数を作る必要があります。
この関数は値を返す必要はありません。というのも、その戻り値型は単にシグナルとして、その関数がイベントトリガを呼び出していることを示しているだけだからです。
特定のイベントに対して複数のイベントトリガが定義された場合、トリガ名のアルファベット順で起動されます。
トリガ定義はWHEN
条件で特定されます。そのため、例えばddl_command_start
トリガはユーザが望む特定のコマンドのみを契機に実行させることができます。
このようなトリガの一般的な使い方として、ユーザが実行するかもしれないDDL文の範囲を狭めることができます。