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获得这些事件的含义。
parsetree
命令的分析树的一个指针。检查PostgreSQL源代码详情。分析树结构改变时不会有通知。
tag
命令标签和事件触发器正在运行的事件有关,例如"CREATE FUNCTION"
。
一个事件触发器函数必须返回一个NULL
指针(不是 SQL null值,也就是,不要设置isNull
为真)。