🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 37.3\. 用C编写事件触发器函数 本节描述事件触发器函数接口的底层细节。只有在用C编写事件触发器函数的时候才会需要这些信息。 如果你使用一种高级语言,那么这些细节已经为你处理了。在大多数情况下, 应该在用C编写事件触发器之前考虑用过程语言。每一个过程语言的文档解释了如何用那种语言编写一个事件触发器。 事件触发器函数必须使用"version 1"函数管理接口。 当通过事件触发器管理调用一个函数的时候,并不传递任何正规参数,而是传递一个 "context"指针指向`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 */ const char *tag; /* command tag */ } EventTriggerData; ``` 成员定义如下: `type` 总是`T_EventTriggerData`。 `event` 描述了函数调用的事件,是`"ddl_command_start"`, `"ddl_command_end"`, `"sql_drop"`之一。参阅[Section 37.1](#calibre_link-845)获得这些事件的含义。 `parsetree` 命令的分析树的一个指针。检查PostgreSQL源代码详情。分析树结构改变时不会有通知。 `tag` 命令标签和事件触发器正在运行的事件有关,例如`"CREATE FUNCTION"`。 一个事件触发器函数必须返回一个`NULL`指针(_不是_ SQL null值,也就是,不要设置`isNull`为真)。