# 40.3.用C语言编写事件触发函数
本节介绍事件触发器函数接口的低级细节。只有在用C编写事件触发器函数时,才需要这些信息。如果您使用的是更高级的语言,那么这些细节将为您处理。在大多数情况下,在编写C.事件触发器之前,应考虑使用过程语言。每个过程语言的文档说明如何在该语言中编写事件触发器。
事件触发器功能必须使用“版本1”功能管理器界面。
事件触发器管理器调用函数时,不会向其传递任何常规参数,但会向其传递一个指向EventTriggerData
结构C函数可以通过执行宏来检查它们是否是从事件触发器管理器调用的:
CALLED_AS_EVENT_TRIGGER(fcinfo)
扩展到:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果返回true,则可以安全地进行强制转换fcinfo->context
打字EventTriggerData*
并利用指向EventTriggerData
结构函数必须不改变EventTriggerData
结构或它指向的任何数据。
结构EventTriggerData
定义在命令/事件触发。H
:
typedef struct EventTriggerData
{
NodeTag type;
const char *event; /* event name */
Node *parsetree; /* parse tree */
CommandTag tag; /* command tag */
} EventTriggerData;
成员定义如下:
类型
总是事件触发数据
.
事件
描述调用函数的事件,其中一个“ddl_命令_开始”
, “ddl_命令_结束”
, “sql_drop”
, “表_重写”
看见第40.1节了解这些事件的意义。
parsetree
指向命令解析树的指针。有关详细信息,请查看PostgreSQL源代码。解析树结构如有更改,恕不另行通知。
标签
例如,与运行事件触发器的事件关联的命令标记“创建函数”
.
事件触发器函数必须返回无效的
指针(不SQL空值,即不设置*isNull
*是的)。