- 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。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3263次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
904次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
531次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
456次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
382次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
349次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
302次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
295次阅读
2025-05-06 14:40:00
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
289次阅读
2025-04-28 11:01:25
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
285次阅读
2025-04-30 12:17:54