- GreatSQL社區(qū)原創(chuàng)內(nèi)容未經(jīng)授權不得隨意使用,轉(zhuǎn)載請聯(lián)系小編并注明來源。
- GreatSQL是MySQL的國產(chǎn)分支版本,使用上與MySQL一致。
- 作者: 亮
- 文章來源:GreatSQL社區(qū)原創(chuàng)
概念介紹
首先需要知道MySQL中觸發(fā)器特點,以及表table相關觸發(fā)器加載方式
- MySQL中單個trigger僅支持單事件觸發(fā)即單個觸發(fā)器不支持類似insert or update等多事件語法操作,如果需要多事件都能被同一個表觸發(fā),只能分別建立多個對應trigger。
- 觸發(fā)器加載首先需要加載觸發(fā)器分組列表Trigger_chain,后續(xù)再將具體觸發(fā)器添加到Trigger_chain內(nèi)。
- 表table屬性內(nèi)可包含多個觸發(fā)器分組列表Trigger_chain,Trigger_chain用于加載不同類別的觸發(fā)器,主要類別有insert、update或delete類型。
- 觸發(fā)器分組列表Trigger_chain內(nèi)m_triggers又可加載多個具體屬于該分組的具體觸發(fā)器。
觸發(fā)器分組列表Trigger_chain加載過程
1.當打開表table時通過如下函數(shù)過程加載觸發(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ā)器加載存儲方式是二維數(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ā)器加載設計方式存在一定的弊端,即TRG_EVENT分組只能按insert、update、delete區(qū)分,單次觸發(fā)事件只能觸發(fā)執(zhí)行對應分組內(nèi)的觸發(fā)器,對于需要擴展單觸發(fā)器同時支持多事件的方式如:insert or update 、update or delete 等方式將需要較大的改造。
觸發(fā)器分組列表Trigger_chain添加具體觸發(fā)器trigger過程
1.打開過的table其觸發(fā)器通過如下函數(shù)過程加載
- 函數(shù)open_tables->open_table_entry_fini->check_n_load
2.具體加載過程
-
通過函數(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)。
當目標表table有insert、update或delete操作時,即會觸發(fā)執(zhí)行對應分組列表Trigger_chain內(nèi)相應分組的觸發(fā)器。
說明:MySQL在新增和刪除觸發(fā)器的操作時都會關閉當前已經(jīng)打開的table句柄,在下次打開table時會重新load相應的trigger。
Enjoy GreatSQL ??
關于 GreatSQL
GreatSQL是由萬里數(shù)據(jù)庫維護的MySQL分支,專注于提升MGR可靠性及性能,支持InnoDB并行查詢特性,是適用于金融級應用的MySQL分支版本。
相關鏈接: GreatSQL社區(qū) Gitee GitHub Bilibili
GreatSQL社區(qū):
社區(qū)博客有獎征稿詳情:https://greatsql.cn/thread-100-1-1.html
技術交流群:
微信:掃碼添加
GreatSQL社區(qū)助手
微信好友,發(fā)送驗證信息加群
。文章來源:http://www.zghlxwxcb.cn/news/detail-446031.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-446031.html
到了這里,關于MySQL觸發(fā)器Trigger加載以及目前局限的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!