9.3 9.4 9.5 9.6 10 11 12 13
阿里云PostgreSQL 问题报告 纠错本页面

37.3. 用 C 编写事件触发器函数

这一节描述了一个事件触发器函数的接口的低层细节。只有用 C 编写事件触发器函数时才需要这些信息。如果你使用一种更高层的语言,那么这些细节就不需要你来处理。在大部分情况下,你应该优先考虑使用一种过程语言。每一种过程语言的文档阐述了如何使用那种语言编写一个事件触发器。

事件触发器函数必须使用"版本 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""table_rewrite"之一。这些事件的含义见第 37.1 节

parsetree

一个指向该命令的解析树的指针。详情请参考 PostgreSQL 源代码。解析树如有变动不另行通知。

tag

该事件触发器为之运行的事件的相关命令标签,例如"CREATE FUNCTION"

一个事件触发器函数必须返回一个NULL指针(不是一个 SQL 空值,也就是不会设置isNull为真)。

<
/BODY >