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

打印 上一主题 下一主题

主题 518|帖子 518|积分 1554


  • 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
  1. 函数open_tables->open_and_process_table->handle_table->add_tables_and_routines_for_triggers
复制代码
2.跟踪add_tables_and_routines_for_triggers函数内参数定义

查看TRG_EVENT_MAX定义
  1. enum enum_trigger_event_type {
  2. TRG_EVENT_INSERT = 0,
  3. TRG_EVENT_UPDATE = 1,
  4. TRG_EVENT_DELETE = 2,
  5. TRG_EVENT_MAX
  6. };
复制代码
查看TRG_ACTION_MAX定义
  1. enum enum_trigger_action_time_type {
  2. TRG_ACTION_BEFORE = 0,
  3. TRG_ACTION_AFTER = 1,
  4. TRG_ACTION_MAX
  5. };
复制代码
查看函数get_triggers内可知触发器加载存储方式是二维数组m_trigger_map内
  1. /// Triggers grouped by event, action_time.
  2. 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表