本節ではトリガ関数とのインタフェースについて低レベルな詳細を説明します。 この情報はC言語でトリガ関数を作成する時にのみ必要です。 高レベルな言語で作成すれば、こうした詳細は代わりに扱ってもらえます。 たいていの場合、Cでトリガを作成する前に手続き言語を使用することを検討すべきです。 各手続き言語の文書で、その言語を使用したイベントトリガの作成方法を説明します。
トリガ関数は「version 1」関数マネージャインタフェースを使わなくてはいけません。
関数がイベントトリガマネージャから呼び出される時は、通常の引数が渡されるのではなく、EventTriggerData構造体を指す「context」ポインタが渡されます。
C関数は、イベントトリガマネージャから呼び出されたのかどうかを以下のマクロを実行することで検査することができます。
CALLED_AS_EVENT_TRIGGER(fcinfo)
これは以下に展開されます。
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
もしこれが真を返す場合、fcinfo->contextをEventTriggerData *型にキャストし、指されたEventTriggerData構造体を使用することは安全です。
その関数は、TriggerData構造体やそれが指すどのようなデータも変更してはいけません。
struct EventTriggerDataはcommands/event_trigger.hの中で定義されています。
typedef struct EventTriggerData
{
NodeTag type;
const char *event; /* イベント名 */
Node *parsetree; /* 解析ツリー */
const char *tag; /* コマンドタグ */
} EventTriggerData;
メンバは下記のように定義されています。
type
常にT_EventTriggerDataです。
event
その関数が呼び出されたイベント、"ddl_command_start"、"ddl_command_end"、"sql_drop"、"table_rewrite"のうちの1つを記述します。
これらのイベントの内容は、40.1を参照してください。
parsetreeコマンドの解析ツリーへのポインタです。 詳細はPostgreSQLのソースコードを確認してください。 解析ツリーの構造は予告なく変更されることがあります。
tag
イベントトリガの実行対象となるイベントに関連するコマンドタグです。たとえば、"CREATE FUNCTION"です。
イベントトリガ関数はNULLポインタ(SQLのNULLではありません。したがって、isNullは真にはなりません)を返さなければなりません。