MySQL觸發(fā)器Trigger加載及目前局限性
概念介紹
首先需要知道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 };
觸發(fā)器加載存儲(chǔ)方式
查看函數(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)鏈接:
以上就是MySQL觸發(fā)器Trigger加載及目前局限性的詳細(xì)內(nèi)容,更多關(guān)于MySQL觸發(fā)器Trigger的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 一文教你如何使用MySQL觸發(fā)器
- 淺談MySQL觸發(fā)器的原理以及使用
- MySQL存儲(chǔ)函數(shù)以及觸發(fā)器詳解
- MySQL中的觸發(fā)器trigger用法解析
- MySQL如何創(chuàng)建觸發(fā)器(CREATE TRIGGER)
- Mysql觸發(fā)器字段雙向更新方式
- mysql觸發(fā)器中監(jiān)控字段的改變方式
- mysql觸發(fā)器同步表的數(shù)據(jù)方式
- MySQL觸發(fā)器實(shí)現(xiàn)兩表數(shù)據(jù)同步的代碼詳解
- MySQL使用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新的應(yīng)用實(shí)例
- 從零開(kāi)始MySQL觸發(fā)器實(shí)戰(zhàn)攻略
- MySQL 觸發(fā)器(TRIGGER)的具體使用
相關(guān)文章
Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù)
這篇文章主要介紹了Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù),幫助大家更好的理解和使用MySQL 數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11mysql數(shù)據(jù)庫(kù)太大了如何備份與還原
今天小編就為大家分享一篇關(guān)于mysql數(shù)據(jù)庫(kù)太大了如何備份與還原,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03探究MySQL優(yōu)化器對(duì)索引和JOIN順序的選擇
這篇文章主要介紹了探究MySQL優(yōu)化器對(duì)索引和JOIN順序的選擇,包括在優(yōu)化器做出錯(cuò)誤判斷時(shí)的選擇情況,需要的朋友可以參考下2015-05-05mysql查詢結(jié)果命令行方式導(dǎo)出/輸出/寫(xiě)入到文件的3種方法舉例
這篇文章主要給大家介紹了關(guān)于mysql查詢結(jié)果命令行方式導(dǎo)出/輸出/寫(xiě)入到文件的3種方法,?在使用MySQL進(jìn)行數(shù)據(jù)庫(kù)操作的過(guò)程中,我們經(jīng)常需要將查詢結(jié)果導(dǎo)出到文件中以備后續(xù)分析和處理,需要的朋友可以參考下2023-08-08如何添加一個(gè)mysql用戶并給予權(quán)限詳解
在很多時(shí)候我們并不會(huì)直接利用mysql的root用戶進(jìn)行項(xiàng)目的開(kāi)發(fā),一般我們都會(huì)創(chuàng)建一個(gè)具有部分權(quán)限的用戶,下面這篇文章主要給大家介紹了關(guān)于如何添加一個(gè)mysql用戶并給予權(quán)限的相關(guān)資料,需要的朋友可以參考下2023-03-03