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

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

イベントトリガは、定義されたデータベース内で関連づけられたイベントが起こるたびに起動します。 今のところサポートされているイベントは、loginddl_command_startddl_command_endtable_rewrite、およびsql_dropです。 今後のリリースで新たなイベントが追加されるかもしれません。

38.1.1. login #

loginイベントは、認証されたユーザがシステムにログインするときに発生します。 このイベントのトリガプロシージャにおけるバグは、システムへのログインの成功を妨げる可能性があります。 このようなバグは、接続文字列または設定ファイルでevent_triggersfalseに設定することで回避できます。 あるいは、シングルユーザモードでシステムを再起動することでも回避できます(このモードではイベントトリガが無効になっているため)。 シングルユーザモードの使用方法の詳細については、postgresのリファレンスページを参照してください。 loginイベントはスタンバイサーバでも実行されます。 サーバがアクセスできなくなるのを防ぐために、このようなトリガは、スタンバイで実行されているときにはデータベースに何も書き込まないようにする必要があります。 また、loginイベントトリガでの長時間実行する問い合わせは避けることをお勧めします。 例えば、psqlで接続を取り消しても進行中のloginトリガを中断しないことに注意してください。

loginイベントトリガの使用方法の例については、38.5を参照してください。

38.1.2. ddl_command_start #

ddl_command_startイベントは、DDLコマンドが実行される直前に発生します。 この文脈でのDDLコマンドは、次の通りです。

  • CREATE

  • ALTER

  • DROP

  • COMMENT

  • GRANT

  • IMPORT FOREIGN SCHEMA

  • REINDEX

  • REFRESH MATERIALIZED VIEW

  • REVOKE

  • SECURITY LABEL

ddl_command_startは、SELECT INTOコマンドが実行される直前にも発生します。 このコマンドはCREATE TABLE ASと同等であるためです。

例外として、このイベントは共有オブジェクトを対象とするDDLコマンドでは発生しません。

  • データベース

  • ロール(ロール定義とロールメンバ資格)

  • テーブル空間

  • パラメータ権限

  • ALTER SYSTEM

このイベントは、イベントトリガ自体を対象とするコマンドでも発生しません。

イベントトリガが起動する前に、影響を受けるオブジェクトが存在するかどうかは確認されません。

38.1.3. ddl_command_end #

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

38.1.4. sql_drop #

sql_dropイベントは、データベースオブジェクトを削除する操作に対するddl_command_endイベントトリガの直前に発生します。 明らかなDROPコマンドの他に、いくつかのALTERコマンドでもsql_dropイベントが発生する可能性があります。

削除されたオブジェクトの一覧を確認するには、sql_dropイベントトリガコードで集合を返す関数pg_event_trigger_dropped_objects()を使用してください(9.30を参照してください)。 トリガはシステムカタログからオブジェクトが削除された後に実行されるため、それ以降それらのオブジェクトは検索できないことに注意してください。

38.1.5. table_rewrite #

table_rewriteイベントは、ALTER TABLEALTER TYPEコマンドのアクションによりテーブルが書き換えられる直前に発生します。 CLUSTERVACUUMのような他の制御文でもテーブルは書き換えられますが、それらではtable_rewriteイベントは発生しません。 書き換えられたテーブルのOIDを見つけるには、関数pg_event_trigger_table_rewrite_oid()を使用し、書き換えられた理由を知るには、関数pg_event_trigger_table_rewrite_reason()を使用します(9.30を参照してください)。

38.1.6. 中断したトランザクションでのイベントトリガ #

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

38.1.7. イベントトリガの作成 #

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

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

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