↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 7.0 已结束支持。 请参阅 当前版本手册.

47.2. 与触发器管理器的交互

如上所述,当函数被触发器管理器调用时,结构 TriggerData *CurrentTriggerData 非 NULL 且已初始化。因此,最好在开始时检查 CurrentTriggerData 是否为 NULL,并在取回信息之后立即把它设为 NULL,以防止并非来自触发器管理器的对触发器函数的调用。

struct 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(tg_event)

如果触发器在之前(BEFORE)触发则返回 TRUE。

TRIGGER_FIRED_AFTER(tg_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(关系名。它不是 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
{
    Oid         tgoid;
    char       *tgname;
    Oid         tgfoid;
    FmgrInfo    tgfunc;
    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 语句中指定的参数。其他成员仅供内部使用。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.