预发布版本文档。 PostgreSQL 19beta4 为测试版本,最终发布内容可能有所不同。
38.2. 用 C 编写事件触发器函数 #
本节描述事件触发器函数接口的底层细节。只有在用 C 编写事件触发器函数时才需要这些信息。如果你使用更高级的语言,那么这些细节会由该语言处理。在大多数情况下,你应先考虑使用过程语言,再决定是否用 C 编写事件触发器。每种过程语言的文档都说明了如何在该语言中编写事件触发器。
事件触发器函数必须使用“版本 1”函数管理器接口。
当事件触发器管理器调用函数时,不会向它传递任何普通参数,而是会传入一个“上下文”指针,指向一个 EventTriggerData
结构体。C 函数可以通过执行下列宏来检查自己是否由事件触发器管理器调用:
CALLED_AS_EVENT_TRIGGER(fcinfo)
该宏会展开为:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果该宏返回真,那么就可以安全地将 fcinfo->context
转换为 EventTriggerData * 类型,并使用它所指向的
EventTriggerData 结构体。该函数不得修改 EventTriggerData
结构体或它所指向的任何数据。
struct EventTriggerData 定义于
commands/event_trigger.h 中:
typedef struct EventTriggerData
{
NodeTag type;
const char *event; /* event name */
Node *parsetree; /* parse tree */
CommandTag tag; /* command tag */
} EventTriggerData;
其中各成员定义如下:
事件触发器函数必须返回一个 NULL 指针(不是 SQL 空值,也就是不要将
isNull 设为真)。