↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

40.3. 用 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;

其中各成员定义如下:

type

始终为 T_EventTriggerData。

event

描述调用该函数对应的事件,可为 "ddl_command_start"、"ddl_command_end"、"sql_drop"、"table_rewrite" 之一。关于这些事件的含义,参见第 40.1 节。

parsetree

指向该命令语法解析树的指针。详见 PostgreSQL 源代码。语法解析树结构可能在不另行通知的情况下发生变化。

tag

与触发该事件触发器的事件相关联的命令标签,例如 "CREATE FUNCTION"。

事件触发器函数必须返回一个 NULL 指针(不是 SQL 空值,也就是不要将 isNull 设为真)。

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.