40.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 EventTriggerDatacommands/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 40.1
  • parsetree

    • 指向命令解析树的指针。有关详细信息,请检查 PostgreSQL 源代码。解析树结构如有更改,恕不另行通知。
  • tag

    • 与为其运行事件触发器的事件相关联的命令标签,例如"CREATE FUNCTION"

事件触发函数必须返回NULL指针(不是 SQL 空值,即,不要设置* isNull * true)。