Postgresql 中文操作指南

40.3. Writing Event Trigger Functions in C #

本节描述了事件触发器函数的接口中底层详细信息。只有在用 C 编写事件触发器函数时才需要这些信息。如果您使用更高级别的语言,那么这些细节将为您处理。在大多数情况下,您应考虑在用 C 编写事件触发器之前使用过程语言。每种过程语言的文档都说明了如何使用该语言编写事件触发器。

事件触发器函数必须使用“版本 1”函数管理器接口。

当函数被事件触发器管理器调用时,不会向它传递任何普通参数,但是会向它传递一个指向 EventTriggerData 结构的“上下文”指针。C 函数可以通过执行宏来检查函数是否是由事件触发器管理器调用的:

CALLED_AS_EVENT_TRIGGER(fcinfo)

它将扩展为:

((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

如果返回 true,那么可以安全地将 fcinfo→context 转换成 EventTriggerData * 类型并利用指向 EventTriggerData 结构。函数必须 not 更改 EventTriggerData 结构或其指向的任何数据。

struct EventTriggerDatacommands/event_trigger.h 中定义:

typedef struct EventTriggerData
{
    NodeTag     type;
    const char *event;      /* event name */
    Node       *parsetree;  /* parse tree */
    CommandTag  tag;        /* command tag */
} EventTriggerData;

其中,成员定义如下:

  • type

    • Always T_EventTriggerData.

  • event

    • 描述函数被调用时的事件,即 "ddl_command_start""ddl_command_end""sql_drop"、_"table_rewrite"_之一。请参见 Section 40.1以了解这些事件的含义。

  • parsetree

    • 指向命令的解析树的指针。请查看 PostgreSQL 源代码以了解详细信息。解析树结构可能会在不经通知的情况下发生更改。

  • tag

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

事件触发器函数必须返回一个 NULL 指针 (not 一个 SQL NULL 值,即不设置 isNull 为 true)。