pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述事件触发器函数接口的底层细节。只有在用 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 */
const char *tag; /* command tag */
} EventTriggerData;
其成员定义如下:
type始终为 T_EventTriggerData。
event描述调用该函数对应的事件,可为 "ddl_command_start"、 "ddl_command_end" 或 "sql_drop" 之一。 关于这些事件的含义,参见 第 37.1 节。
parsetree指向该命令语法解析树的指针。详见 PostgreSQL 源代码。 语法解析树结构可能在不另行通知的情况下发生变化。
tag与触发该事件触发器的事件相关联的命令标签,例如 "CREATE FUNCTION"。
事件触发器函数必须返回一个 NULL 指针 (不是 SQL 空值,也就是不要将 isNull 设为真)。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。