觸發器是特殊預存程序,針對資料表的 INSERT、UPDATE、DELETE 事件自動執行。SQL Server 2000 另新增 INSTEAD OF 觸發器 (本文不涵蓋)。
CREATE TABLE Student (
StudentID INT PRIMARY KEY, -- 學號
-- 其他欄位...
)
CREATE TABLE BorrowRecord (
BorrowRecordID INT IDENTITY(1,1), -- 流水號
StudentID INT, -- 學號 (FK)
BorrowDate DATETIME, -- 借出時間
ReturnDate DATETIME -- 歸還時間
)
CREATE TRIGGER truStudent ON Student
FOR UPDATE
AS
IF UPDATE(StudentID)
BEGIN
UPDATE BorrowRecord
SET StudentID = i.StudentID
FROM BorrowRecord br
JOIN Deleted d ON br.StudentID = d.StudentID
JOIN Inserted i ON d.StudentID = i.StudentID
END
CREATE TRIGGER trdStudent ON Student
FOR DELETE
AS
DELETE BorrowRecord
FROM BorrowRecord br
JOIN Deleted d ON br.StudentID = d.StudentID
觸發器執行時,系統自動建立兩個唯讀虛擬表,結構與基底表相同:
| 操作 | Inserted 表內容 | Deleted 表內容 |
|---|---|---|
| INSERT | 新增的資料列 | 空 |
| UPDATE | 更新後的新資料列 | 更新前的舊資料列 |
| DELETE | 空 | 被刪除的資料列 |
UPDATE 可視為:產生新列 → Inserted、複製舊列 → Deleted、刪除舊列、寫入新列。
sp_configure 'nested triggers', 0 關閉ON UPDATE CASCADE、ON DELETE CASCADE,效能優於觸發器、語意更清晰結論:理解 Inserted/Deleted 是寫好觸發器的關鍵,但能用聲明式約束 (PK/FK/Cascade) 解決的,優先用約束。