本节描述了事件触发函数接口的底层细节。只有在用 C 语言编写事件触发函数时才需要这些信息。如果您使用更高级的语言,则这些细节会为您处理。在大多数情况下,您应该考虑在使用 C 语言编写事件触发器之前使用过程语言。每种过程语言的文档都解释了如何用该语言编写事件触发器。
事件触发函数必须使用 “版本 1” 函数管理器接口。
当函数被事件触发管理器调用时,它不会传递任何正常的参数,而是传递一个指向 EventTriggerData
结构的 “上下文” 指针。C 函数可以通过执行宏来检查它们是否是从事件触发管理器调用的
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 */ 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
指针(不是 SQL null 值,即不要设置 isNull
为 true)。
如果您发现文档中的任何内容不正确,与您使用特定功能的经验不符,或者需要进一步澄清,请使用此表单报告文档问题。