トリガーマネージャとの関係

上述の通り、トリガーマネージャから関数が呼び出された時、 TriggerData *CurrentTriggerData 構造体は NOT NULL で初期化され ます。トリガーマネージャ以外からのトリガー関数の呼び出しを防ぐ ために、関数の最初で CurrentTriggerData が NULL になっていないか を点検し、情報を取り出した後はすぐに NULL を設定した方が良いで しょう。

TriggerData 構造体は src/include/commands/trigger.h で次のよう に定義されています。

typedef struct TriggerData
{
	TriggerEvent	tg_event;
	Relation	tg_relation;
	HeapTuple	tg_trigtuple;
	HeapTuple	tg_newtuple;
	Trigger		*tg_trigger;
} TriggerData;
tg_event
  は、関数を呼び出したイベントの種類を示します。次のマクロを 
  tg_event を検査するために使用できます。

   TRIGGER_FIRED_BEFORE(event) は BEFORE トリガーならばTRUE を返
                               します。
   TRIGGER_FIRED_AFTER(event) は AFTER トリガーならば TRUE を返し
                              ます。
   TRIGGER_FIRED_FOR_ROW(event) は ROW レベルのトリガーならば 
                                TRUE を返します。
   TRIGGER_FIRED_FOR_STATEMENT(event) は STATEMENT レベルのトリガ
                                      ーならば TRUE を返します。
   TRIGGER_FIRED_BY_INSERT(event) は INSERT によって発行されたトリ
                                  ガーならば TRUE を返します。
   TRIGGER_FIRED_BY_DELETE(event) は DELETE によって発行されたトリ
                                  ガーならば TRUE を返します。
   TRIGGER_FIRED_BY_UPDATE(event) は UPDATE によって発行されたトリ
                                  ガーならば TRUE を返します。

tg_relation
  は、トリガーが発行されたリレーションを示す構造体へのポインタで
  す。この構造体の詳細については src/include/utils/rel.h を見て下
  さい。最も興味があることは、(リレーションのタプルの記述子を示
  す)tg_relation->rd_att と(リレーションの名前を示す)
  tg_relation->rd_rel->relname です。( relname は、char* でなく、
  NameData です。この名前のコピーが必要な場合は 
  SPI_getrelname(tg_relation) を使って char* を取得して下さい。)

tg_trigtuple
  はトリガーが発行されたタプルのポインタです。( INSERT の場合は)
  挿入された、( DELETE の場合は)削除された、( UPDATE の場合は)
  更新されたタプルを示します。INSERT または DELETE の場合に、( 
  INSERT の場合)他のものでそのタプルを置き換えたくない時や操作を
  とばしたくない時、これをエグゼキュータに返します。

tg_newtuple
  は、UPDATE の場合はタプルの新しいバージョンへのポインタとなり、
  INSERT または DELETE の場合は NULL となります。UPDATE の場合に、
  他のものでこのタプルを置き換えたくない時や操作をとばしたくない
  時、これをエグゼキュータに返します。

tg_trigger
  は、src/include/utils/rel.h で定義された Trigger 構造体へのポイ
  ンタです。

typedef struct Trigger
{
	char		*tgname;
	Oid		tgfoid;
	func_ptr	tgfunc;
	int16		tgtype;
	int16		tgnargs;
	int16		tgattr[8];
	char		**tgargs;
} Trigger;

   tgname はトリガー名、tgnargs は tgargs 内にある引数の数、tgargs 
   は CREATE TRIGGER 文で指定した引数へのポインタの配列です。他のメ
   ンバは内部処理でのみに使用されます。