登录
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 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 null 值,即不要将*isNull
*设置为 true)。