• 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社区:

MySQL触发器Trigger加载以及目前局限

社区有奖建议反应: greatsql.cn/thread-54-1…

社区博客有奖征稿概况: greatsql.cn/thread-100-…

社区2022年度勋章获奖名单: greatsql.cn/thread-184-…

(对文章有疑问或者有独到见解都能够去社区官网提出或共享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:增加GreatSQL社区助手(微信号:wanlidbc )老友,待社区助手拉您进群。