乐趣区

关于数据库:MySQL触发器Trigger加载以及目前局限

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
  • GreatSQL 是 MySQL 的国产分支版本,应用上与 MySQL 统一。
  • 作者:亮
  • 文章起源:GreatSQL 社区原创

概念介绍

首先须要晓得 MySQL 中触发器特点,以及表 table 相干触发器加载形式

  1. MySQL 中单个 trigger 仅反对单事件触发即单个触发器不反对相似 insert or update 等多事件语法操作,如果须要多事件都能被同一个表触发,只能别离建设多个对应 trigger。
  2. 触发器加载首先须要加载触发器分组列表 Trigger_chain,后续再将具体触发器增加到 Trigger_chain 内。
  3. 表 table 属性内可蕴含多个触发器分组列表 Trigger_chain,Trigger_chain 用于加载不同类别的触发器,次要类别有 insert、update 或 delete 类型。
  4. 触发器分组列表 Trigger_chain 内 m_triggers 又可加载多个具体属于该分组的具体触发器。

触发器分组列表 Trigger_chain 加载过程

1. 当关上表 table 时通过如下函数过程加载触发器分组列表 Trigger_chain

函数 open_tables->open_and_process_table->handle_table->add_tables_and_routines_for_triggers

2. 跟踪 add_tables_and_routines_for_triggers 函数内参数定义

查看 TRG_EVENT_MAX 定义

enum enum_trigger_event_type {

TRG_EVENT_INSERT = 0,

TRG_EVENT_UPDATE = 1,

TRG_EVENT_DELETE = 2,

TRG_EVENT_MAX

};

查看 TRG_ACTION_MAX 定义

enum enum_trigger_action_time_type {

TRG_ACTION_BEFORE = 0,

TRG_ACTION_AFTER = 1,

TRG_ACTION_MAX

};

查看函数 get_triggers 内可知触发器加载存储形式是二维数组 m_trigger_map 内

/// Triggers grouped by event, action_time.

Trigger_chain *m_trigger_map[TRG_EVENT_MAX] [TRG_ACTION_MAX];
  • 综合 TRG_EVENT_MAX 和 TRG_ACTION_MAX 以及 m_trigger_map 能够看出目前 MySQL 触发器加载设计形式存在肯定的弊病,即 TRG_EVENT 分组只能按 insert、update、delete 辨别,单次触发事件只能触发执行对应分组内的触发器,对于须要扩大单触发器同时反对多事件的形式如:insert or update、update or delete 等形式将须要较大的革新。

触发器分组列表 Trigger_chain 增加具体触发器 trigger 过程

1. 关上过的 table 其触发器通过如下函数过程加载

  • 函数 open_tables->open_table_entry_fini->check_n_load

2. 具体加载过程

  • 通过函数 check_n_load 内调用 load_triggers 函数从磁盘加载曾经建好的触发器 t。
  • 而后调用 create_trigger_chain 函数获取到后期曾经加载的触发器分组列表 Trigger_chain。
  • 最初触发器分组列表 Trigger_chain 调用 add_trigger 增加具体触发器 t 至分组列表内。
  • 当指标表 table 有 insert、update 或 delete 操作时,即会触发执行对应分组列表 Trigger_chain 内相应分组的触发器。

阐明:MySQL 在新增和删除触发器的操作时都会敞开以后曾经关上的 table 句柄,在下次关上 table 时会从新 load 相应的 trigger。


Enjoy GreatSQL :)

## 对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

相干链接:GreatSQL 社区 Gitee GitHub Bilibili

GreatSQL 社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

技术交换群:

微信:扫码增加 GreatSQL 社区助手 微信好友,发送验证信息 加群

退出移动版