首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 觸發器實戰教學:Cascade 更新/刪除與 Inserted/Deleted 魔法表詳解

     編輯:關於SqlServer

觸發器基礎概念

觸發器是特殊預存程序,針對資料表的 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                -- 歸還時間
)

需求 1:修改學號時,借書記錄同步更新 (UPDATE 觸發器)

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

需求 2:刪除學生時,連帶刪除借書記錄 (DELETE 觸發器)

CREATE TRIGGER trdStudent ON Student
FOR DELETE
AS
DELETE BorrowRecord
FROM BorrowRecord br
JOIN Deleted d ON br.StudentID = d.StudentID

核心關鍵:Inserted / Deleted 虛擬表

觸發器執行時,系統自動建立兩個唯讀虛擬表,結構與基底表相同:

操作Inserted 表內容Deleted 表內容
INSERT新增的資料列空
UPDATE更新後的新資料列更新前的舊資料列
DELETE空被刪除的資料列

UPDATE 可視為:產生新列 → Inserted、複製舊列 → Deleted、刪除舊列、寫入新列。

觸發器設計最佳實務

  • 避免巢狀觸發:預設允許巢狀 32 層,建議 sp_configure 'nested triggers', 0 關閉
  • 效能考量:觸發器在交易內執行,複雜邏輯會拉長鎖定時間,影響並發
  • 改用外鍵 Cascade:SQL Server 2000 支援 ON UPDATE CASCADE、ON DELETE CASCADE,效能優於觸發器、語意更清晰
  • 審計/日誌:觸發器適合記錄變更歷程、跨資料表同步等無法用外鍵處理的場景

結論:理解 Inserted/Deleted 是寫好觸發器的關鍵,但能用聲明式約束 (PK/FK/Cascade) 解決的,優先用約束。

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