この節では、トリガ関数のインターフェイスの低レベルな詳細について説明します。この情報はトリガ関数をCで書く場合にのみ必要になります。もしもっと高レベルな関数言語を使っている場合はこれらの問題はすでに解決されています。
Note: ここで説明されるインターフェイスは PostgreSQL 7.1以降に当てはまります。それ以前のバージョンではTriggerDataポインタはグローバル変数CurrentTriggerDataの中で渡されていました。
関数がトリガマネージャから呼び出されるときは、通常のどのようなパラメータに渡されるのではなくTriggerData構造体を指す "context"ポインタに渡されます。C関数はトリガマネージャから呼び出されたのかどうかをマクロ CALLED_AS_TRIGGER(fcinfo)を実行することでチェックすることができ、下記のようになります。
((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
もしこれがTRUEを返す場合、fcinfo->contextを TriggerData *型にキャストし、TriggerData構造体を指すものを利用することは安全です。その関数はTriggerData構造体やそれが指すどのようなデータも変えてはいけません。
TriggerData構造体はsrc/include/commands/trigger.hの中で定義されています。
typedef struct TriggerData { NodeTag type; TriggerEvent tg_event; Relation tg_relation; HeapTuple tg_trigtuple; HeapTuple tg_newtuple; Trigger *tg_trigger; } TriggerData;
メンバは下記のように定義されています。
もしこれがトリガイベントである場合、常に T_TriggerDataです。
その関数が呼び出されたイベントを説明します。tg_eventを調べるためには下記のマクロを使うことができます。
トリガがBEFOREで発行され場合TRUEを返します。
トリガがAFTERを発行した場合TRUEを返します。
トリガが行レベルのイベントを発行した場合TRUEを返します。
トリガがステートメントレベルのイベントを発行した場合TRUEを返します。
トリガがINSERTに発行された場合TRUEを返します。
トリガがDELETEに発行された場合TRUEを返します。
トリガがUPDATEに発行された場合TRUEを返します。
トリガされたリレーションを説明する構造体へのポインタです。この構造体についての詳細はsrc/include/utils/rel.hを参照してください。最も興味深いのはtg_relation->rd_att(リレーションタプルの記述子)とtg_relation->rd_rel->relnameです(リレーション名、これはchar*ではなくNameDataです。もし名前のコピーが必要な場合はchar*を得るためにSPI_getrelname(tg_relation)を使ってください)。
トリガが発行されたタプルへのポインタです。これは挿入された(INSERTの場合)、削除された(DELETEの場合)、更新された(UPDATEの場合)タプルです。もしINSERT/DELETEの場合、タプルを別のもの(INSERT)で置き換えるか演算子を飛ばしたくなければ、これをエクゼキュータに返してください。
もしこれがINSERTかDELETEのためでUPDATEかNULLならば、タプルの新しいバージョンのためのポインタです。もしUPDATEだった場合で別のタプルで置き換えるか演算を飛ばしたくなければ、これをエクゼキュータに返してください。
src/include/utils/rel.hで定義された構造体Triggerへのポインタです。
typedef struct Trigger { Oid tgoid; char *tgname; Oid tgfoid; int16 tgtype; bool tgenabled; bool tgisconstraint; bool tgdeferrable; bool tginitdeferred; int16 tgnargs; int16 tgattr[FUNC_MAX_ARGS]; char **tgargs; } Trigger;
ここではtgnameがトリガの名前、tgnargsがtgargsの中の引数の数、tgargsはCREATE TRIGGER文で指定された引数へのポインタの配列です。他のメンバは内部使用のみです。