MySQL觸發(fā)器Trigger加載及目前局限性
概念介紹
首先需要知道MySQL中觸發(fā)器特點,以及表table相關觸發(fā)器加載方式
- MySQL中單個trigger僅支持單事件觸發(fā)即單個觸發(fā)器不支持類似insert or update等多事件語法操作,如果需要多事件都能被同一個表觸發(fā),只能分別建立多個對應trigger。
- 觸發(fā)器加載首先需要加載觸發(fā)器分組列表Trigger_chain,后續(xù)再將具體觸發(fā)器添加到Trigger_chain內。
- 表table屬性內可包含多個觸發(fā)器分組列表Trigger_chain,Trigger_chain用于加載不同類別的觸發(fā)器,主要類別有insert、update或delete類型。
- 觸發(fā)器分組列表Trigger_chain內m_triggers又可加載多個具體屬于該分組的具體觸發(fā)器。
觸發(fā)器分組列表Trigger_chain加載過程
1.當打開表table時通過如下函數過程加載觸發(fā)器分組列表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 };
觸發(fā)器加載存儲方式
查看函數get_triggers內可知觸發(fā)器加載存儲方式是二維數組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觸發(fā)器加載設計方式存在一定的弊端,即TRG_EVENT分組只能按insert、update、delete區(qū)分,單次觸發(fā)事件只能觸發(fā)執(zhí)行對應分組內的觸發(fā)器,對于需要擴展單觸發(fā)器同時支持多事件的方式如:insert or update 、update or delete 等方式將需要較大的改造。
觸發(fā)器分組列表Trigger_chain添加具體觸發(fā)器trigger過程
1.打開過的table其觸發(fā)器通過如下函數過程加載
- 函數open_tables->open_table_entry_fini->check_n_load
2.具體加載過程
- 通過函數 check_n_load內調用load_triggers函數從磁盤加載已經建好的觸發(fā)器t。
- 然后調用create_trigger_chain函數獲取到前期已經加載的觸發(fā)器分組列表Trigger_chain。
- 最后觸發(fā)器分組列表Trigger_chain調用add_trigger添加具體觸發(fā)器t至分組列表內。
- 當目標表table有insert、update或delete操作時,即會觸發(fā)執(zhí)行對應分組列表Trigger_chain內相應分組的觸發(fā)器。
說明:MySQL在新增和刪除觸發(fā)器的操作時都會關閉當前已經打開的table句柄,在下次打開table時會重新load相應的trigger。
Enjoy GreatSQL :)
## 關于 GreatSQL
GreatSQL是由萬里數據庫維護的MySQL分支,專注于提升MGR可靠性及性能,支持InnoDB并行查詢特性,是適用于金融級應用的MySQL分支版本。
相關鏈接:
以上就是MySQL觸發(fā)器Trigger加載及目前局限性的詳細內容,更多關于MySQL觸發(fā)器Trigger的資料請關注腳本之家其它相關文章!
相關文章
mysql查詢結果命令行方式導出/輸出/寫入到文件的3種方法舉例
這篇文章主要給大家介紹了關于mysql查詢結果命令行方式導出/輸出/寫入到文件的3種方法,?在使用MySQL進行數據庫操作的過程中,我們經常需要將查詢結果導出到文件中以備后續(xù)分析和處理,需要的朋友可以參考下2023-08-08