他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

この節では、トリガ関数のインターフェイスの低レベルな詳細について説明します。この情報はトリガ関数を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;

メンバは下記のように定義されています。

type

もしこれがトリガイベントである場合、常に T_TriggerDataです。

tg_event

その関数が呼び出されたイベントを説明します。tg_eventを調べるためには下記のマクロを使うことができます。

TRIGGER_FIRED_BEFORE(tg_event)

トリガがBEFOREで発行され場合TRUEを返します。

TRIGGER_FIRED_AFTER(tg_event)

トリガがAFTERを発行した場合TRUEを返します。

TRIGGER_FIRED_FOR_ROW(event)

トリガが行レベルのイベントを発行した場合TRUEを返します。

TRIGGER_FIRED_FOR_STATEMENT(event)

トリガがステートメントレベルのイベントを発行した場合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です(リレーション名、これはchar*ではなくNameDataです。もし名前のコピーが必要な場合はchar*を得るためにSPI_getrelname(tg_relation)を使ってください)。

tg_trigtuple

トリガが発行されたタプルへのポインタです。これは挿入された(INSERTの場合)、削除された(DELETEの場合)、更新された(UPDATEの場合)タプルです。もしINSERT/DELETEの場合、タプルを別のもの(INSERT)で置き換えるか演算子を飛ばしたくなければ、これをエクゼキュータに返してください。

tg_newtuple

もしこれがINSERTかDELETEのためでUPDATEかNULLならば、タプルの新しいバージョンのためのポインタです。もしUPDATEだった場合で別のタプルで置き換えるか演算を飛ばしたくなければ、これをエクゼキュータに返してください。

tg_trigger

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