首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 觸發器 實戰入門:從語法到審計日誌自動化應用

     編輯:MySQL 資料庫相關知識

什麼是觸發器?

觸發器 是針對特定表的 INSERT、UPDATE、DELETE 事件,自動執行的預儲 SQL 程式碼。MySQL 5.0+ 引入,5.7/8.0 持續增強。典型用途:審計日誌、衍生欄位維護、跨表同步、資料完整性檢查。

核心語法

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
  -- SQL 陳述式;可使用 NEW.col / OLD.col 存取新舊值
END;
  • BEFORE:事件前執行,可修改 NEW 值
  • AFTER:事件後執行,不可修改 NEW
  • FOR EACH ROW:逐列觸發(MySQL 僅支援行級)

範例一:自動統計字元總數

CREATE TABLE `data` (`name` VARCHAR(255));
CREATE TABLE `chars` (`count` INT(10));
INSERT INTO `chars` VALUES (0);

CREATE TRIGGER `t1` AFTER INSERT ON `data`
FOR EACH ROW
  UPDATE `chars` SET `count` = `count` + CHAR_LENGTH(NEW.`name`);

-- 測試
INSERT INTO `data` VALUES ('Alice'), ('Bob');
SELECT * FROM `chars`; -- count = 8

範例二:帳戶變動審計日誌(實戰常用)

CREATE TABLE `accounts` (
  `id` INT PRIMARY KEY,
  `label` VARCHAR(50),
  `balance` DECIMAL(12,2)
);
INSERT INTO `accounts` VALUES
(1,'Savings #1',500),
(2,'Current #1',2000),
(3,'Current #2',3500);

CREATE TABLE `audit` (
  `id` INT,
  `balance` DECIMAL(12,2),
  `user` VARCHAR(100),
  `time` DATETIME
);

CREATE TRIGGER `audit_balance` AFTER UPDATE ON `accounts`
FOR EACH ROW
  INSERT INTO `audit` (`id`,`balance`,`user`,`time`)
  VALUES (OLD.`id`, NEW.`balance`, CURRENT_USER(), NOW());

-- 測試
UPDATE `accounts` SET `balance`=500 WHERE `id`=1;
UPDATE `accounts` SET `balance`=900 WHERE `id`=3;
SELECT * FROM `audit`;
/* 結果:
id=1, balance=500, user=root@localhost, time=...
id=3, balance=900, user=root@localhost, time=...
*/

管理指令

  • 查看觸發器:SHOW TRIGGERS\G 或 SELECT * FROM information_schema.TRIGGERS
  • 刪除觸發器:DROP TRIGGER [IF EXISTS] trigger_name
  • 權限需求:TRIGGER 權限(MySQL 5.1.6+)

效能與避坑指南

  • 避免觸發器巢狀過深:觸發器內再觸發其他表觸發器,易導致死循環或效能雪崩
  • 謹慎使用 BEFORE 修改 NEW:可能繞過應用層驗證邏輯
  • 大量批次操作考慮停用觸發器:SET @TRIGGER_DISABLED=1; 配合觸發器內判斷跳過
  • 備份/還原注意:mysqldump --triggers 預設包含,還原時需確保目標版本相容

結語

觸發器將業務規則下沉至資料庫層,能保證跨應用的一致性(如審計日誌)。但業務邏輯盡量留在應用層,觸發器僅用於無法繞過的資料完整性與審計場景,並建立完善的單元測試與文檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved