与触发器管理器交互

如我们前面所说,当触发器管理器调用函数时,结构 TriggerData *CurrentTriggerData 是 NOT NULL (非空)的并且初始化过的.所以最好检查 CurrentTriggerData 结构以防止在开始时就是 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)

returns TRUE if trigger fired BEFORE.(触发器由 BEFORE 触发返回 TRUE)
TRIGGER_FIRED_AFTER(tg_event)

Returns TRUE if trigger fired AFTER.(触发器由 AFTER 触发返回 TRUE)
TRIGGER_FIRED_FOR_ROW(event)

Returns TRUE if trigger fired for a ROW-level event.(触发器行级(ROW-level)触发返回 TRUE)
TRIGGER_FIRED_FOR_STATEMENT(event)

Returns TRUE if trigger fired for STATEMENT-level event.(触发器语句级(ROW-level)触发返回 TRUE)
TRIGGER_FIRED_BY_INSERT(event)

Returns TRUE if trigger fired by INSERT.(触发器由 INSERT 触发返回 TRUE)
TRIGGER_FIRED_BY_DELETE(event)

Returns TRUE if trigger fired by DELETE.(触发器由 DELETE 触发返回 TRUE)
TRIGGER_FIRED_BY_UPDATE(event)

Returns TRUE if trigger fired by UPDATE.(触发器由 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 语句里声明的参数.其他成员只在内部使用.