百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

PostgreSQL技术内幕29:事件触发器tag原理解析

haoteby 2025-05-14 13:31 15 浏览

0.简介

在上一篇文章中中,我们介绍了PG中的两种触发器,即适合于DML的普通触发器和对于DDL的事件触发器,其中事件触发器与常规的 DML 触发器(响应行级别或语句级别操作)不同的地方在于事件触发器在 DDL 操作的生命周期中触发,触发时执行用户指定的存储过程或函数,可以用于监控或限制数据库结构的变更。 本文对于事件触发器中细节进行进一步的说明,也就是tag的原理。

1.概念说明

在上一篇文章中说明了创建事件触发器的语法,其中可以使用filter_variable指定触发事件过滤器的条件,也就是tag,其基本作用是实现对于ddl细分类型的精准触发,比如在建表时触发可以带上如下内容:

WHEN TAG IN ('CREATE TABLE')

2.tag的生成和存储

2.1 tag合法性校验

在创建事件触发器中的语法可以看到其tag是以字符串形式存在的,那么就需要验证其是否合法,其验证函数如下:

/*
 * Validate DDL command tags.
 */
static void
validate_ddl_tags(const char *filtervar, List *taglist)
{
    ListCell   *lc;
    foreach(lc, taglist)
    {
        const char *tag = strVal(lfirst(lc));
        event_trigger_command_tag_check_result result;
        result = check_ddl_tag(tag);
        if (result == EVENT_TRIGGER_COMMAND_TAG_NOT_RECOGNIZED)
            ereport(ERROR,
                    (errcode(ERRCODE_SYNTAX_ERROR),
                     errmsg("filter value \"%s\" not recognized for filter variable \"%s\"",
                            tag, filtervar)));
        if (result == EVENT_TRIGGER_COMMAND_TAG_NOT_SUPPORTED)
            ereport(ERROR,
                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
            /* translator: %s represents an SQL statement name */
                     errmsg("event triggers are not supported for %s",
                            tag)));
    }
}

其中主要使用check_ddl_tag函数去检查是否合法,主要包含两步,一是直接比较字符串是否一致,二是比较是否是由支持的类型组合而成比如drop和event_trigger_support数组中的INDEX组合,其是否支持就是true。

2.2 内存中存储

事件触发器在内存中是以哈希表的形式存储的,其中key是事件类型,value是触发器构成的链表,那么在查找执行时就需要做两次的过滤:一是对事件进行过滤,二是对于tag进行过滤,只执行都匹配的触发器函数。

static HTAB *EventTriggerCache;

2.3 持久化存储

在之前文章中对事件触发器存储的系统表是pg_event_trigger有过描述,此处主要介绍一下PG在后续版本对于tag的查找优化。因为tag是字符串且可能数量比较多,那么每次都进行全量的字符串匹配就会带来很多额外的计算开销,所以PG利用固定tag的index构建了bitmap,方便查找是否符合条件。

3.tag的触发

tag触发逻辑较为简单,在事件触发器的执行逻辑内部增加了一层相应的判断,其查找函数为EventTriggerCommonSetup:

相关推荐

DIY桌面激光雕刻机#是时候展现真正的技术了

激光雕刻机。这期视频我们来看一下我是如何DIY一台桌面激光雕刻机。前几天在水池子边上发现了一台旧电脑,我看这电脑上还有一些东西可以利用到,比如光驱上面拆出了步进电机和滑轨。所以本期视频我将用这些废品去...

100000块多米诺骨牌拼成超级马里奥,这款机器人1天就完成了

智东西(公众号:zhidxcom)编译|王健恩编辑|高歌智东西7月30日消息,美国工程师兼YouTube博主MarkRober创造出了一个可以自动摆放多米诺骨牌的机器人。这个机器人被命名为D...

这个3D打印机器人可以在30秒内打开密码锁

密码锁看似很安全?也许曾经是,但现在你可要当心了!这是因为一台3D打印制造的机器人就可以在半分钟内打开你的密码锁。上周四,知名黑客萨米·卡姆卡尔(SamyKamkar)在自己的网站上公布了一个称之为...

密码锁也不安全 这款机器人30秒即可自动打开

大学生和体育爱好者们要注意了,千万不要再把贵重物品存放在公共储物柜里。因为现在已经出现了一种3D打印的机器人,据说世界上各大锁商推出的大部分密码锁,它都能够在30秒之内打开。著名黑客山米·卡姆卡(Sa...

硬件单片机模拟器,再也不用买开发板了...

#头条创作挑战赛#记得2006年在凌阳科技(sunplus)工作的时候,凌阳科技开发了自己的编译器/集成开发环境(unspIDE),那个IDE除了有keil那样的编辑器、编译器、链接器、调试器、下载...

3D打印机分哪几部分构成?(3d打印机结构组成及系统分析)

3D打印机的构成根据技术类型(如FDM、SLA、SLS等)有所不同,但以最常见的FDM(熔融沉积成型)3D打印机为例,其核心组成部分可分为以下模块:1.机械结构框架提供整体支撑和稳定性,常见材质为金...

初学者学伺服都需要什么?石家庄诺仕通

#初学者学伺服都需要什么?#对于初学者学习伺服系统,需要从...

arduino(arduino是单片机吗)

arduino学习笔记arduino学习笔记1-什么是arduino?...

自制写字机,你需要的全套资料都在这里

小编之前发过《用废旧光驱制作迷你绘图仪》,很多读者都成功制作了自己的绘图仪。但是该方法的缺点是gcode要在inkscape软件中生成,然后通过grbl-controller这个没有界面的程序发送画图...

自己动手DIY3D打印机 瞬间效果出现桌面时,大家都惊呆了!

3D打印机,对数码产品比较了解的朋友都知道,但是真正玩过的童鞋可能就不多了。其实3D打印机离我们并不远,随着3D打印技术越来越成熟,3D打印机的学习资料也越来越多,这让自己动手做一台桌面3D打印机也成...

机器人仅用24小时将十万块多米诺骨牌拼出马里奥,创下世界纪录

十万块多米诺骨牌倒下是个啥场面?等等,十万块?那得搭多久啊?...

如何制作一个机器人?(制作机器人的方法)

1.简单机械机器人(例如自动小车)2.智能机器人(带有人工智能或计算机视觉)3.工业机器人(用于生产自动化)4.人形机器人(类人结构,可以行走、对话)...

CrowPi2树莓派4学习套件评测第1部分–开箱和首次启动

文章来源:CNXSoftware中文站2020年6月,我曾写过一篇关于深圳易科诺...

基于 Arduino UNO 的蓝牙汽车(arduino智能小车蓝牙控制app)

HC-05蓝牙模块HC-05是一款易于使用的蓝牙SPP模块,针对流畅的串行无线通信配置进行了优化。串口蓝牙模块是完全合格的蓝牙V2.0+EDR(增强数据速率)3Mbps调制,具有总2.4...

电机驱动设计方案带你初识机电一体化

在直流电机驱动电路的设计中,主要考虑以下几点:功能:电机是单向还是双向转动?需不需要调速?...