觸發器是針對表級 DML 事件(INSERT/UPDATE/DELETE)自動執行的存儲程序,支援行級觸發,廣泛用於審計日誌、衍生列維護、跨表同步、業務規則強制執行。本文系統梳理創建語法(單/多語句)、查看元數據、刪除操作、NEW/OLD 伪表、權限要求、效能影響與替代方案。
FOLLOWS/PRECEDES 排序)TRIGGER 權限(5.1.6+),SUPER 用於變更 Binlog 格式相關CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
statement_1;
statement_2;
...
END;
DELIMITER //
CREATE TRIGGER save_time_trigger
BEFORE INSERT ON student_info
FOR EACH ROW
INSERT INTO time_log(save_time, save_info) VALUES (NOW(), 'INSERT');
//
DELIMITER ;
CREATE TRIGGER audit_student_update
BEFORE UPDATE ON student_info
FOR EACH ROW
BEGIN
IF OLD.name != NEW.name OR OLD.age != NEW.age THEN
INSERT INTO time_log(save_time, save_info)
VALUES (NOW(), CONCAT('UPDATE: ', OLD.name, '→', NEW.name, ', age: ', OLD.age, '→', NEW.age));
END IF;
END;
事件 NEW OLD 可修改 NEW INSERT 新行值 不可用 BEFORE 可修改 UPDATE 新值 舊值 BEFORE 可修改 DELETE 不可用 被刪行值 不可用 五、查看與管理觸發器
1. 列出所有觸發器
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME = 'trigger_name' AND TRIGGER_SCHEMA = 'db_name'\G3. 刪除觸發器
維度 影響 優化建議 執行開銷 同步阻塞 DML,增加延遲 邏輯極簡化、避免複雜查詢、必要時異步化(消息隊列) 鎖持有時間 延長行鎖/表鎖持有 觸發器內不做大事務、不鎖其他表 Binlog 體積 觸發器內 DML 同步記錄 評估 Binlog 增長、備份窗口影響 遞歸觸發 觸發器修改同表 → 死循環 嚴禁觸發器操作觸發源表,使用標誌位/標誌表判斷 調試難度 隱式執行,難以追蹤 完整日誌、單元測試覆蓋、變更審查強制項 七、常見反模式與替代方案
VIRTUAL/STORED)觸發器是資料庫層面的「切面編程」,對於簡單、確定性、低頻、強一致性要求高的行級副作用(如審計、軟刪除、衍生列維護)是優雅方案。但對於複雜邏輯、高併發寫入、跨表/跨庫操作、需異步解耦的場景,應用層事件驅動 + CDC + 消息隊列是更現代、可擴展的架構選擇。建議:嚴格控制觸發器數量,建立觸發器變更審查機制,定期評估效能影響並遷移至應用層。