- GreatSQL社區(qū)原創(chuàng)內(nèi)容未經(jīng)授權(quán)不得隨意使用,轉(zhuǎn)載請(qǐng)聯(lián)系小編并注明來(lái)源鞍爱。
- GreatSQL是MySQL的國(guó)產(chǎn)分支版本举娩,使用上與MySQL一致。
- 作者: 亮
- 文章來(lái)源:GreatSQL社區(qū)原創(chuàng)
概念介紹
首先需要知道MySQL中觸發(fā)器特點(diǎn)皿哨,以及表table相關(guān)觸發(fā)器加載方式
- MySQL中單個(gè)trigger僅支持單事件觸發(fā)即單個(gè)觸發(fā)器不支持類似insert or update等多事件語(yǔ)法操作,如果需要多事件都能被同一個(gè)表觸發(fā)纽谒,只能分別建立多個(gè)對(duì)應(yīng)trigger证膨。
- 觸發(fā)器加載首先需要加載觸發(fā)器分組列表Trigger_chain,后續(xù)再將具體觸發(fā)器添加到Trigger_chain內(nèi)鼓黔。
- 表table屬性內(nèi)可包含多個(gè)觸發(fā)器分組列表Trigger_chain央勒,Trigger_chain用于加載不同類別的觸發(fā)器,主要類別有insert澳化、update或delete類型崔步。
- 觸發(fā)器分組列表Trigger_chain內(nèi)m_triggers又可加載多個(gè)具體屬于該分組的具體觸發(fā)器。
觸發(fā)器分組列表Trigger_chain加載過(guò)程
1.當(dāng)打開表table時(shí)通過(guò)如下函數(shù)過(guò)程加載觸發(fā)器分組列表Trigger_chain
函數(shù)open_tables->open_and_process_table->handle_table->add_tables_and_routines_for_triggers
2.跟蹤add_tables_and_routines_for_triggers函數(shù)內(nèi)參數(shù)定義
查看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
};
查看函數(shù)get_triggers內(nèi)可知觸發(fā)器加載存儲(chǔ)方式是二維數(shù)組m_trigger_map內(nèi)
/// 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觸發(fā)器加載設(shè)計(jì)方式存在一定的弊端肆捕,即TRG_EVENT分組只能按insert刷晋、update盖高、delete區(qū)分慎陵,單次觸發(fā)事件只能觸發(fā)執(zhí)行對(duì)應(yīng)分組內(nèi)的觸發(fā)器,對(duì)于需要擴(kuò)展單觸發(fā)器同時(shí)支持多事件的方式如:insert or update 喻奥、update or delete 等方式將需要較大的改造席纽。
觸發(fā)器分組列表Trigger_chain添加具體觸發(fā)器trigger過(guò)程
1.打開過(guò)的table其觸發(fā)器通過(guò)如下函數(shù)過(guò)程加載
- 函數(shù)open_tables->open_table_entry_fini->check_n_load
2.具體加載過(guò)程
通過(guò)函數(shù) check_n_load內(nèi)調(diào)用load_triggers函數(shù)從磁盤加載已經(jīng)建好的觸發(fā)器t。
然后調(diào)用create_trigger_chain函數(shù)獲取到前期已經(jīng)加載的觸發(fā)器分組列表Trigger_chain撞蚕。
最后觸發(fā)器分組列表Trigger_chain調(diào)用add_trigger添加具體觸發(fā)器t至分組列表內(nèi)润梯。
當(dāng)目標(biāo)表table有insert、update或delete操作時(shí),即會(huì)觸發(fā)執(zhí)行對(duì)應(yīng)分組列表Trigger_chain內(nèi)相應(yīng)分組的觸發(fā)器纺铭。
說(shuō)明:MySQL在新增和刪除觸發(fā)器的操作時(shí)都會(huì)關(guān)閉當(dāng)前已經(jīng)打開的table句柄寇钉,在下次打開table時(shí)會(huì)重新load相應(yīng)的trigger。
Enjoy GreatSQL :)
關(guān)于 GreatSQL
GreatSQL是由萬(wàn)里數(shù)據(jù)庫(kù)維護(hù)的MySQL分支舶赔,專注于提升MGR可靠性及性能扫倡,支持InnoDB并行查詢特性,是適用于金融級(jí)應(yīng)用的MySQL分支版本竟纳。
相關(guān)鏈接: GreatSQL社區(qū) Gitee GitHub Bilibili
GreatSQL社區(qū):
社區(qū)有獎(jiǎng)建議反饋: https://greatsql.cn/thread-54-1-1.html
社區(qū)博客有獎(jiǎng)?wù)鞲逶斍椋?/strong> https://greatsql.cn/thread-100-1-1.html
社區(qū)2022年度勛章獲獎(jiǎng)名單: https://greatsql.cn/thread-184-1-1.html
(對(duì)文章有疑問(wèn)或者有獨(dú)到見(jiàn)解都可以去社區(qū)官網(wǎng)提出或分享哦~)