与触发器管理器交互
如我们前面所说,当触发器管理器调用函数时,结构 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
语句里声明的参数.其他成员只在内部使用.