本節ではトリガ関数とのインタフェースについて低レベルな詳細を説明します。 この情報は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_Event_TriggerData
です。
event
その関数が呼び出されたイベント、"ddl_command_start"
、"ddl_command_end"
、"sql_drop"
、"table_rewrite"
のうちの1つを記述します。
これらのイベントの内容は、38.1. イベントトリガ動作の概要を参照してください。
parsetree
コマンドの解析ツリーへのポインタです。 詳細はPostgreSQLのソースコードを確認してください。 解析ツリーの構造は予告なく変更されることがあります。
tag
イベントトリガの実行対象となるイベントに関連するコマンドタグです。たとえば、"CREATE FUNCTION"
です。
イベントトリガ関数はNULL
ポインタ(SQLのNULLではありません。したがって、isNull
は真にはなりません)を返さなければなりません。