Postgresql 中文操作指南
40.3. Writing Event Trigger Functions in C #
本节描述了事件触发器函数的接口中底层详细信息。只有在用 C 编写事件触发器函数时才需要这些信息。如果您使用更高级别的语言,那么这些细节将为您处理。在大多数情况下,您应考虑在用 C 编写事件触发器之前使用过程语言。每种过程语言的文档都说明了如何使用该语言编写事件触发器。
事件触发器函数必须使用“版本 1”函数管理器接口。
当函数被事件触发器管理器调用时,不会向它传递任何普通参数,但是会向它传递一个指向 EventTriggerData 结构的“上下文”指针。C 函数可以通过执行宏来检查函数是否是由事件触发器管理器调用的:
CALLED_AS_EVENT_TRIGGER(fcinfo)
它将扩展为:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果返回 true,那么可以安全地将 fcinfo→context 转换成 EventTriggerData * 类型并利用指向 EventTriggerData 结构。函数必须 not 更改 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
-
Always T_EventTriggerData.
-
-
event
-
描述函数被调用时的事件,即 "ddl_command_start"、"ddl_command_end"、"sql_drop"、_"table_rewrite"_之一。请参见 Section 40.1以了解这些事件的含义。
-
-
parsetree
-
指向命令的解析树的指针。请查看 PostgreSQL 源代码以了解详细信息。解析树结构可能会在不经通知的情况下发生更改。
-
-
tag
-
与为其运行事件触发器的事件关联的命令标记,例如 "CREATE FUNCTION"。
-
事件触发器函数必须返回一个 NULL 指针 (not 一个 SQL NULL 值,即不设置 isNull 为 true)。