- GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
- GreatSQL 是 MySQL 的国产分支版本,应用上与 MySQL 统一。
- 作者:亮
- 文章起源:GreatSQL 社区原创
概念介绍
首先须要晓得 MySQL 中触发器特点,以及表 table 相干触发器加载形式
- MySQL 中单个 trigger 仅反对单事件触发即单个触发器不反对相似 insert or update 等多事件语法操作,如果须要多事件都能被同一个表触发,只能别离建设多个对应 trigger。
- 触发器加载首先须要加载触发器分组列表 Trigger_chain,后续再将具体触发器增加到 Trigger_chain 内。
- 表 table 属性内可蕴含多个触发器分组列表 Trigger_chain,Trigger_chain 用于加载不同类别的触发器,次要类别有 insert、update 或 delete 类型。
- 触发器分组列表 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 社区助手
微信好友,发送验证信息加群
。