用C编写事件触发器函数

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 37. 事件触发器 | 下一页

# 37.3. 用C编写事件触发器函数

本节描述事件触发器函数接口的底层细节。只有在用C编写事件触发器函数的时候才会需要这些信息。 如果你使用一种高级语言，那么这些细节已经为你处理了。在大多数情况下， 应该在用C编写事件触发器之前考虑用过程语言。每一个过程语言的文档解释了如何用那种语言编写一个事件触发器。

事件触发器函数必须使用"version 1"函数管理接口。

当通过事件触发器管理调用一个函数的时候，并不传递任何正规参数，而是传递一个 "context"指针指向`EventTriggerData`结构。 C函数可以检查它们是从事件触发器管理调用还是通过执行宏：

    CALLED_AS_EVENT_TRIGGER(fcinfo)

扩展到：

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

如果返回真，那么传递`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"`之一。参阅第 37.1 节获得这些事件的含义。

`parsetree`

  命令的分析树的一个指针。检查PostgreSQL源代码详情。分析树结构改变时不会有通知。

`tag`

  命令标签和事件触发器正在运行的事件有关，例如`"CREATE FUNCTION"`。

一个事件触发器函数必须返回一个`NULL`指针（不是 SQL null值，也就是，不要设置`isNull`为真）。

上一页 | 起始页 | 下一页
事件触发器触发矩阵 | 上一级 | 一个完整的事件触发器的例子