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

SQL Server 2000 觸發器實戰詳解:INSERTED/DELETED 表、四類觸發器與 INSTEAD OF 進階應用

     編輯:關於SqlServer

觸發器是資料庫應用的可重用工具。本文系統整理官方教程核心內容,涵蓋四類觸發器運作機制、邏輯表用法與 INSTEAD OF 進階特性。

核心邏輯表

觸發器類型INSERTED 表DELETED 表
INSERT新增列副本空
DELETE空被刪除列副本
UPDATE更新後新值(後像)更新前舊值(前像)
  • 兩表皆為記憶體內邏輯表,唯讀、結構與基礎表同、觸發器結束自動銷毀。
  • 可直接 SELECT * FROM inserted 檢視。
  • 日誌不可讀,但 inserted/deleted 讓觸發器能引用 DML 導致的日誌變化。

四類觸發器範例

1. INSERT 觸發器:同步庫存

CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS
UPDATE P SET UnitsInStock = P.UnitsInStock - I.Quantity
FROM Products P JOIN Inserted I ON P.ProductID = I.ProductID

2. DELETE 觸發器:級聯停用產品

CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS
UPDATE P SET Discontinued = 1
FROM Products P JOIN Deleted D ON P.CategoryID = D.CategoryID

3. UPDATE 觸發器:保護主鍵不可修改

CREATE TRIGGER Employee_Update ON Employees FOR UPDATE AS
IF UPDATE(EmployeeID)
BEGIN
    RAISERROR('Employee ID cannot be modified.', 10, 1)
    ROLLBACK TRANSACTION
END
  • IF UPDATE(col) 檢測單一欄位;COLUMNS_UPDATED() 位元遮罩檢測多欄位。

4. INSTEAD OF 觸發器:啟用視圖更新

  • 取代原始 DML,僅執行觸發器邏輯。
  • 可建立於表或視圖,同操作類型僅一個。
  • 適用:不可更新視圖(聯結視圖、分割視圖)、條件式執行/錯誤轉向。
  • 不可建立於 WITH CHECK OPTION 視圖。
  • 觸發器內仍可存取 inserted/deleted。

DELETE 觸發器特殊限制

  • TRUNCATE TABLE 不觸發 DELETE 觸發器(不寫入日誌)。
  • deleted 表空間配置於記憶體,高速緩存。

總結

掌握 inserted/deleted 雙表語意、四類觸發器適用場景與 IF UPDATE 精準攔截,是實作資料完整性、稽核與業務規則的核心技能。INSTEAD OF 進一步打破視圖更新限制,擴展資料庫層業務表達力。

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