Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

40.3. 使用 C 编写事件触发器函数 #

本节介绍事件触发器函数接口的底层详细信息。仅在使用 C 编写事件触发器函数时才需要这些信息。如果您使用的是高级语言,则会为您处理这些详细信息。在大多数情况下,您应考虑在使用 C 编写事件触发器之前使用过程语言。每种过程语言的文档都说明了如何使用该语言编写事件触发器。

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

当事件触发器管理器调用函数时,不会向其传递任何常规参数,但会向其传递一个 context 指针,该指针指向 EventTriggerData 结构。C 函数可以通过执行宏来检查它们是否由事件触发器管理器调用

CALLED_AS_EVENT_TRIGGER(fcinfo)

它扩展为

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

如果返回 true,则可以安全地将 fcinfo->context 转换为类型 EventTriggerData * 并使用指向的 EventTriggerData 结构。该函数必须 更改 EventTriggerData 结构或其指向的任何数据。

struct EventTriggerDatacommands/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 null 值,即不要将 isNull 设置为 true)。