当前位置: 首页 > news >正文

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

文章目录

    • 0.简介
    • 1.概念说明
    • 2.tag的生成和存储
      • 2.1 tag合法性校验
      • 2.2 内存中存储
      • 2.3 持久化存储
    • 3.tag的触发

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:
在这里插入图片描述

相关文章:

  • 开发者专用部署工具PasteSpider的V5正式版发布啦!(202504月版),更新说明一览
  • 厚铜PCB打样全流程解析:从文件审核到可靠性测试的关键步骤
  • 华为L410上制作内网镜像模板:在客户端配置模板内容
  • 1.10软考系统架构设计师:优秀架构设计师 - 练习题附答案及超详细解析
  • Jetpack Compose 基础组件学习2.1:Surface
  • VuePress可以做什么?
  • Centos 7 ssh连接速度慢(耗时秒+)
  • 视频噪点多,如何去除画面噪点?
  • Kafka 架构设计和组件介绍
  • Golang | 位运算
  • 复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
  • GitHub Copilot (Gen-AI) 很有用,但不是很好
  • 【Python】保持Selenium稳定爬取的方法(防检测策略)
  • 点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法
  • Java学习手册:时间戳、时区等相关概念
  • 项目笔记2:post请求是什么,还有什么请求
  • 应力腐蚀环功能及指标
  • 【AI平台】n8n入门2:第一个工作流,调用本地大模型
  • 【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
  • 虚拟滚动;懒加载;高并发组件
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏
  • 商超展销延长、专区专柜亮相……上海“外贸拓内销”商品与市民见面
  • 四川落马厅官周海琦受审,1000多人接受警示教育
  • 泽连斯基与特朗普进行简短会谈
  • 金正恩出席朝鲜人民军海军驱逐舰入水仪式
  • 为何不当教练转型高校管理岗?苏炳添曾吐露过真实的想法