On this page
39.3. 用 C 编写事件触发函数
本节描述事件触发功能的接口的低级详细信息。仅在使用 C 编写事件触发功能时才需要此信息。如果您使用的是高级语言,则将为您处理这些详细信息。在大多数情况下,您应该在使用 C 编写事件触发器之前考虑使用过程语言。每种过程语言的文档都说明了如何用该语言编写事件触发器。
事件触发功能必须使用“版本 1”功能 Management 器界面。
事件触发 Management 器调用函数时,不会传递任何常规参数,而是会传递指向EventTriggerData
结构的“上下文”指针。 C 函数可以通过执行宏来检查是否从事件触发器 Management 器中调用了它们:
CALLED_AS_EVENT_TRIGGER(fcinfo)
扩展为:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果返回 true,则可以安全地将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"
之一。有关这些事件的含义,请参见Section 39.1。
- 描述为其调用函数的事件,
parsetree
- 指向命令解析树的指针。有关详细信息,请检查 PostgreSQL 源代码。解析树结构如有更改,恕不另行通知。
tag
- 与为其运行事件触发器的事件相关联的命令标签,例如
"CREATE FUNCTION"
。
- 与为其运行事件触发器的事件相关联的命令标签,例如
事件触发函数必须返回NULL
指针(不是 SQL 空值,即,不要设置* isNull
* true)。