PostgreSQL Programmer's Guide
PrevChapter 12. TriggersNext

Interaction with the Trigger Manager

上記で述べたように、関数がトリガー管理によって呼ばれるとき、構造体 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) returns TRUE if trigger fired BEFORE;
   TRIGGER_FIRED_AFTER(event) returns TRUE if trigger fired AFTER;
   TRIGGER_FIRED_FOR_ROW(event) returns TRUE if trigger fired for
                                ROW-level event;
   TRIGGER_FIRED_FOR_STATEMENT(event) returns TRUE if trigger fired for
                                STATEMENT-level event;
   TRIGGER_FIRED_BY_INSERT(event) returns TRUE if trigger fired by INSERT;
   TRIGGER_FIRED_BY_DELETE(event) returns TRUE if trigger fired by DELETE;
   TRIGGER_FIRED_BY_UPDATE(event) returns TRUE if trigger fired by UPDATE.

tg_relation
   はトリガーされた関係を記述する構造体へのポインターです。この構造体の
   詳細については src/include/utils/rel.h 見て下さい。最も興味ある事は
   tg_relation->rd_att (タプル関係の記述子) と
   tg_relation->rd_rel->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
   は構造体 Trigger へのポインタで、src/include/utils/rel.h の中で定義
   されてます:

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 文の中で指定される引数へのポインターの配列です。他のメ
   ンバは内部使用のためだけです。


PrevHomeNext
TriggersUpVisibility of Data Changes