暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【翻译PG】39.3. 用 C 编写事件触发器函数

seagull 2024-10-25
79

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

这一节描述了事件触发器函数接口的低层细节。只有在用 C 编写事件 触发器函数时才需要用到这里的信息。如果使用更高层的语言,那么 这些细节已经被处理好了。在大部分情况下都应该优先考虑使用过程 语言来编写你的事件触发器。每一种过程语言的文档都解释了如何用 它编写事件触发器。

事件触发器函数必须使用”的函数管理器接口。

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

CALLED_AS_EVENT_TRIGGER(fcinfo)

这个宏会被扩展为:

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

如果这个宏返回真,那么就可以安全地把 fcinfo->context造型为类型EventTriggerData *并且使用所指向的EventTriggerData结构。 函数修改 EventTriggerData结构以及它指向的任何内容。

struct EventTriggerDatacommands/event_trigger.h中定义:

typedef struct EventTriggerData
{
    NodeTag     type;
    const char *event;      /* 事件名称 */
    Node       *parsetree;  /* 解析树 */
    const char *tag;        /* 命令标签 */
} EventTriggerData;

其中的成员定义如下:

总是T_EventTriggerData

描述要为其调用这个函数的事件,可以是 "ddl_command_start""ddl_command_end""sql_drop""table_rewrite"之一。 这些事件的含义请见第 39.1 节

该命令的解析树的指针。其细节可以参考 PostgreSQL 的源代码。 解析树结构可能会在未经通知的情况下改变。

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


一个事件触发器函数必须返回一个NULL指针( 一个 SQL 空值,也就是不要把 isNull设置为真)。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论