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

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

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

35.3. 用 C 编写触发器函数 #

本节描述触发器函数接口的底层细节。只有用 C 编写触发器函数时 才需要这些信息。如果你使用的是更高层次的语言,那么这些细节 会替你处理。每种过程语言的文档说明了如何用该语言编写触发器。

触发器函数必须使用“版本 1”函数管理器接口。

当函数被触发器管理器调用时,它不会被传递任何普通参数,而是 被传递一个指向 TriggerData 结构体的 “上下文”指针。C 函数可以通过执行宏

CALLED_AS_TRIGGER(fcinfo)

来检查自己是否是被触发器管理器调用的,该宏展开为

((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))

如果它返回真,那么就可以安全地把 fcinfo->context 转换为 TriggerData * 类型并使用所指向的 TriggerData 结构体。该函数不得修改 TriggerData 结构体或它指向的任何数据。

struct TriggerData 定义在 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)

如果触发器在操作之前触发则返回真。

TRIGGER_FIRED_AFTER(tg_event)

如果触发器在操作之后触发则返回真。

TRIGGER_FIRED_FOR_ROW(tg_event)

如果触发器针对行级事件触发则返回真。

TRIGGER_FIRED_FOR_STATEMENT(tg_event)

如果触发器针对语句级事件触发则返回真。

TRIGGER_FIRED_BY_INSERT(tg_event)

如果触发器由一条 INSERT 命令引发则返回真。

TRIGGER_FIRED_BY_UPDATE(tg_event)

如果触发器由一条 UPDATE 命令引发则返回真。

TRIGGER_FIRED_BY_DELETE(tg_event)

如果触发器由一条 DELETE 命令引发则返回真。

tg_relation

一个指针,指向描述该触发器所针对的关系的结构体。关于这个 结构体的细节请参看 utils/rel.h。其中 最令人感兴趣的是 tg_relation->rd_att(关系元组的 描述符)和 tg_relation->rd_rel->relname (关系名;其类型不是 char* 而是 NameData;如果你需要该名称的一个副本,可以使用 SPI_getrelname(tg_relation) 来获得一个 char*)。

tg_trigtuple

一个指针,指向引发该触发器的行。这就是正在被插入、更新或 删除的行。如果这个触发器是针对 INSERT 或 DELETE 触发的,那么当你不想(在 INSERT 的情形下)用另一个行替换该行或 跳过该操作时,就应当从函数返回它。

tg_newtuple

一个指针,指向该行的新版本(如果触发器是针对 UPDATE 触发的);如果是针对 INSERT 或 DELETE, 则它为 NULL。当事件是一次 UPDATE 而你不想用另一个行替换该行或跳过该操作时,就必须从函数 返回它。

tg_trigger

一个指针,指向 Trigger 类型的结构体,它定义 在 utils/rel.h 中:

typedef struct Trigger
{
    Oid         tgoid;
    char       *tgname;
    Oid         tgfoid;
    int16       tgtype;
    bool        tgenabled;
    bool        tgisconstraint;
    Oid         tgconstrrelid;
    bool        tgdeferrable;
    bool        tginitdeferred;
    int16       tgnargs;
    int16       tgattr[FUNC_MAX_ARGS];
    char      **tgargs;
} Trigger;

其中 tgname 是触发器的名称, tgnargs 是 tgargs 中参数 的数量,tgargs 是一个指针数组,指向 CREATE TRIGGER 语句中指定的参数。其他 成员仅供内部使用。

触发器函数必须返回 NULL 或者一个 HeapTuple 指针。如果你不想修改正在被操作的行, 请注意根据情况返回 tg_trigtuple 或 tg_newtuple。

提交更正

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