-- 分數表
CREATE TABLE sc (
ScId INT NOT NULL PRIMARY KEY,
SNo INT NOT NULL,
CNo INT NOT NULL,
Score INT DEFAULT NULL
);
-- 異動記錄表
CREATE TABLE score_record (
SrId INT NOT NULL PRIMARY KEY,
SNo INT NOT NULL,
CNo INT NOT NULL,
OldScore INT NOT NULL,
NewScore INT NOT NULL,
UpdateTime DATETIME NOT NULL
);
使用 NEW/OLD 伪表欄位,DELIMITER 變更語句結束符:
DROP TRIGGER IF EXISTS `trigger_sr`;
DELIMITER //
CREATE TRIGGER `trigger_sr` AFTER UPDATE ON `sc`
FOR EACH ROW
BEGIN
INSERT INTO score_record
SET SNo = NEW.SNo,
CNo = NEW.CNo,
OldScore = OLD.Score,
NewScore = NEW.Score,
UpdateTime = NOW();
END//
DELIMITER ;
使用 INSERTED/DELETED 邏輯表,採 T-SQL 變數宣告與流程控制:
CREATE TRIGGER trigger_sr ON sc
FOR UPDATE
AS
DECLARE @SNo INT, @CNo INT, @OldScore INT, @NewScore INT;
SELECT @SNo = SNo, @CNo = CNo, @OldScore = Score FROM DELETED;
SELECT @NewScore = Score FROM INSERTED;
INSERT INTO score_record (SNo, CNo, OldScore, NewScore, UpdateTime)
VALUES (@SNo, @CNo, @OldScore, @NewScore, GETDATE());
| 特性 | MySQL | SQL Server |
|---|---|---|
| 觸發時機關鍵字 | BEFORE / AFTER | INSTEAD OF / AFTER (FOR) |
| 行級觸發 | FOR EACH ROW (預設) | 隱含行級,透過 INSERTED/DELETED 處理集合 |
| 新/舊值引用 | NEW.col / OLD.col | INSERTED.col / DELETED.col |
| 語句結束符 | 需自訂 DELIMITER | 標準 GO 或分號 |
| 變數宣告 | SET @var = ... 或 DECLARE 在 BEGIN 內 | DECLARE @var TYPE |
| 多行邏輯區塊 | BEGIN ... END | BEGIN ... END |
| 取得當前時間 | NOW() | GETDATE() |
INSERTED/DELETED 為虛擬表,可一次處理多筆異動,效能較佳但邏輯稍複雜。掌握一種資料庫的觸發器機制後,轉學另一種主要在「語法映射」與「集合 vs 行級思維」的切換。建議實作幾個實際業務案例(如稽核軌跡、衍生欄位維護、跨表同步)以深化理解。