PostgreSQL | ||
---|---|---|
Prev | Chapter 39. Triggers | Next |
上記で述べたように、関数がトリガー管理によって呼ばれるとき、構造体 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 文の中で指定される引数へのポインターの配列です。他のメ ンバは内部使用のためだけです。
Prev | Home | Next |
Triggers | Up | Visibility of Data Changes |