此节介绍事件触发器函数界面的低级详细信息。仅在以 C 编写事件触发器函数时才需要此信息。如果您使用高级语言,则会为您处理这些详细信息。在大多数情况下,您应考虑在以 C 编写事件触发器之前使用过程语言。每种过程语言的文档说明如何在此语言中编写事件触发器。
事件触发器函数必须使用“版本 1”函数管理器界面。
当函数被事件触发管理器调用时,不会传递任何正常参数,但会传递一个“context”指针,指向EventTriggerData
结构。C函数可以通过执行宏来检查它们是否由事件触发管理器调用
CALLED_AS_EVENT_TRIGGER(fcinfo)
它展开为
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果这返回true,则可以安全地将fcinfo->context
转换为EventTriggerData *
类型并使用指向的EventTriggerData
结构。函数必须not更改EventTriggerData
结构或它指向的任何数据。
struct EventTriggerData
在commands/event_trigger.h
中定义
typedef struct EventTriggerData { NodeTag type; const char *event; /* event name */ Node *parsetree; /* parse tree */ CommandTag tag; /* command tag */ } EventTriggerData;
其中成员定义如下
type
始终为T_EventTriggerData
。
event
描述调用函数的事件,即"login"
、"ddl_command_start"
、"ddl_command_end"
、"sql_drop"
、"table_rewrite"
之一。有关这些事件的含义,请参阅第 38.1 节。
parsetree
指向命令的解析树的指针。有关详细信息,请查看 PostgreSQL 源代码。解析树结构可能会随时更改,恕不另行通知。
tag
与运行事件触发的事件关联的命令标记,例如"CREATE FUNCTION"
。
事件触发器函数必须返回一个NULL
指针(not一个 SQL null 值,也就是说,不要将isNull
设置为 true)。