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

 更新时间:2023年05月18日 09:20:50   作者:GreatSQL社区  
这篇文章主要为大家介绍了MySQL触发器Trigger加载以及目前局限性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概念介绍

首先需要知道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。

Enjoy GreatSQL :)

## 关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接:

 GreatSQL社区 

 Gitee

 GitHub

以上就是MySQL触发器Trigger加载及目前局限性的详细内容,更多关于MySQL触发器Trigger的资料请关注脚本之家其它相关文章!

相关文章

  • Windows免安装MySQL 8.0.28 版本图文教程

    Windows免安装MySQL 8.0.28 版本图文教程

    这篇文章主要为大家详细介绍了Windows免安装MySQL8.0.28版本图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • mysql如何在线修改主从复制选项

    mysql如何在线修改主从复制选项

    这篇文章主要介绍了mysql如何在线修改主从复制选项,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • Mysql 实现字段拼接的三个函数

    Mysql 实现字段拼接的三个函数

    这篇文章主要介绍了Mysql 实现字段拼接的三个函数,帮助大家更好的理解和使用MySQL 数据库,感兴趣的朋友可以了解下
    2020-11-11
  • mysql数据库太大了如何备份与还原

    mysql数据库太大了如何备份与还原

    今天小编就为大家分享一篇关于mysql数据库太大了如何备份与还原,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Linux下自动备份MySQL的方法

    Linux下自动备份MySQL的方法

    这篇文章主要介绍了Linux下自动备份MySQL的方法,需要的朋友可以参考下
    2015-01-01
  • 探究MySQL优化器对索引和JOIN顺序的选择

    探究MySQL优化器对索引和JOIN顺序的选择

    这篇文章主要介绍了探究MySQL优化器对索引和JOIN顺序的选择,包括在优化器做出错误判断时的选择情况,需要的朋友可以参考下
    2015-05-05
  • mysql查询结果命令行方式导出/输出/写入到文件的3种方法举例

    mysql查询结果命令行方式导出/输出/写入到文件的3种方法举例

    这篇文章主要给大家介绍了关于mysql查询结果命令行方式导出/输出/写入到文件的3种方法, 在使用MySQL进行数据库操作的过程中,我们经常需要将查询结果导出到文件中以备后续分析和处理,需要的朋友可以参考下
    2023-08-08
  • 详解MySQL8.0 密码过期策略

    详解MySQL8.0 密码过期策略

    这篇文章主要介绍了MySQL8.0 密码过期策略的相关资料,帮助大家更好的理解和使用MySQL8.0的新功能,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL中创建表的三种方法汇总

    MySQL中创建表的三种方法汇总

    这篇文章主要介绍了MySQL中创建表的三种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 如何添加一个mysql用户并给予权限详解

    如何添加一个mysql用户并给予权限详解

    在很多时候我们并不会直接利用mysql的root用户进行项目的开发,一般我们都会创建一个具有部分权限的用户,下面这篇文章主要给大家介绍了关于如何添加一个mysql用户并给予权限的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论