美文网首页
MySQL触发器Trigger加载以及目前局限

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

作者: GreatSQL | 来源:发表于2023-05-16 09:39 被阅读0次
  • 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-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

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

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

技术交流:

相关文章

  • mysql触发器

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger...

  • Mysql触发器(下篇)

    接着Mysql触发器上篇来讲-------- 根据上篇的插入触发器,sql语句如下: create trigger...

  • MySQL基础之触发器,函数,存储过程

    1 MySQL触发器 触发器创建: 参数说明: trigger_event就是insert|update|dele...

  • PHP操作MYSQL触发器讲解

    一,触发器 1.创建触发器 在MySQL中,创建触发器语法如下: 代码如下: CREATE TRIGGER tri...

  • Mysql触发器语法与项目中的一次使用

    Mysql触发器语法与项目中的一次使用 触发器简介 : 触发器(Trigger)是一个特殊的存储过程,它的执行不是...

  • 4. SQL编程之MySQL 触发器

    SQL编程之MySQL 触发器先介绍一下触发器trigger的基本概念: 一个触发器一定是绑定在某个table上面...

  • zabbixApi4j-Trigger

    Trigger trigger.addependencies: 添加新的触发器依赖项trigger.create:...

  • SQLite 触发器(Trigger)

    SQLite 触发器(Trigger) SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据...

  • 触发器

    基本概念 触发器(trigger)是MySQL语句响应以下任意语句而自动执行的一条MySQL语句(或位于begin...

  • mybaties5.7版本触发器栗子

    update 语句后更新修改时间以及其他数据-- 创建触发器CREATE TRIGGER sys_fileup...

网友评论

      本文标题:MySQL触发器Trigger加载以及目前局限

      本文链接:https://www.haomeiwen.com/subject/msovsdtx.html