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

深入 SQL Server 觸發器(二):INSTEAD OF 觸發器、多表視圖更新與交易處理

     編輯:關於SqlServer

INSTEAD OF vs AFTER

特性AFTER (FOR)INSTEAD OF
觸發時機DML 完成、約束檢查通過後取代 DML 動作,基底表不自動修改
適用物件僅資料表資料表、視圖
典型用途稽核、衍生資料維護、複雜驗證回滾多表視圖更新、跨表業務邏輯、攔截 DML
效能較高(原生動作已完成)較低(需手動執行 DML)

多表視圖更新實例

視圖 V_CustOrderDetail 聯合 Customers、Orders、OrderDetails、Products。
建立 INSTEAD OF UPDATE 觸發器於視圖:

CREATE TRIGGER V_CustOrderDetail_Upd ON V_CustOrderDetail INSTEAD OF UPDATE AS
BEGIN
    -- 1. 更新 Customers
    UPDATE C SET ContactName = I.ContactName, Phone = I.Phone
    FROM Customers C JOIN Inserted I ON C.CustomerID = I.CustomerID;

    -- 2. 更新 Orders
    UPDATE O SET OrderDate = I.OrderDate, ShipVia = I.ShipVia
    FROM Orders O JOIN Inserted I ON O.OrderID = I.OrderID;

    -- 3. 更新 OrderDetails
    UPDATE OD SET Quantity = I.Quantity, Discount = I.Discount
    FROM OrderDetails OD JOIN Inserted I ON OD.OrderID = I.OrderID AND OD.ProductID = I.ProductID;
END

觸發器內的交易處理

  • 觸發器隱含於觸發它的交易內;ROLLBACK TRANSACTION 會回滾整個批次。
  • 若需部分提交,可在觸發器內使用 SAVE TRANSACTION 做存檔點,但需謹慎設計。
  • 多列更新:觸發器**一次啟發**處理所有受影響列,務必使用集合式寫法(JOIN Inserted/Deleted),避免游標逐列處理。

偵測欄位變更

  • IF UPDATE(ColName):該欄位出現在 UPDATE 清單中即為真(即使值未變)。
  • COLUMNS_UPDATED():回傳 VARBINARY 位元遮罩,可一次檢查多欄位。
    範例:IF SUBSTRING(COLUMNS_UPDATED(),1,1) & 0x0F > 0 檢查前 4 欄是否任一更新。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved