- 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)打開(kāi)表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.打開(kāi)過(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ù)從磁盤(pán)加載已經(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)打開(kāi)的table句柄,在下次打開(kāi)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)提出或分享哦~)