2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

38.2. 用 C 语言编写事件触发器函数 #

本节描述了事件触发器函数的接口的底层细节。这些信息仅在用 C 语言编写事件触发器函数时才需要。如果您使用的是更高级的语言,那么这些细节将由语言为您处理。在大多数情况下,您应该考虑使用过程语言,然后再用 C 语言编写事件触发器。每种过程语言的文档都解释了如何用该语言编写事件触发器。

事件触发器函数必须使用“version 1”函数管理器接口。

当函数被事件触发器管理器调用时,它不会接收任何常规参数,而是接收一个指向 EventTriggerData 结构的“context”指针。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

描述调用函数的事件,这些事件包括 "login""ddl_command_start""ddl_command_end""sql_drop""table_rewrite"。有关这些事件的含义,请参阅 第 38.1 节

parsetree

指向命令的解析树的指针。有关详细信息,请检查 PostgreSQL 源代码。解析树结构可能会在不通知的情况下更改。

tag

与事件触发器运行的事件相关的命令标签,例如 "CREATE FUNCTION"

事件触发器函数必须返回一个 NULL 指针(不是 SQL 的 null 值,即不要将 isNull 设置为 true)。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。