↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 6.5 / 6.4 / 6.3
历史版本PostgreSQL 6.3 已于 2003 年 3 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

39.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(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(关系名。它不是 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 语句中指定的参数。
   其他成员仅供内部使用。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。