# 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*是的)。