• 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社区助手微信好友,发送验证信息加群