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

SQL Server 2000 觸發器詳解:INSERT、DELETE、UPDATE 觸發器與 inserted/deleted 魔術表

     編輯:關於SqlServer

INSERT 觸發器

  • 觸發時機:INSERT 陳述式執行後。
  • inserted 邏輯表:包含新增列的完整副本,可供觸發器讀取/比對/驗證。
  • 範例:更新產品庫存
    CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS
    UPDATE P SET UnitsInStock = P.UnitsInStock - I.Quantity
    FROM Products P INNER JOIN Inserted I ON P.ProductID = I.ProductID;

DELETE 觸發器

  • deleted 邏輯表:保存被刪除列的副本。
  • 特性:
    ① 列已從實體表移除,deleted 與實體表無相同列。
    ② 空間配置於記憶體,效能極高。
    ③ TRUNCATE TABLE 不觸發(不記錄 Log)。
  • 範例:標記停產商品
    CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS
    UPDATE P SET Discontinued = 1
    FROM Products P INNER JOIN Deleted D ON P.CategoryID = D.CategoryID;

UPDATE 觸發器

  • 視為「刪除舊列 → 新增新列」兩步驟:
    deleted 存放舊值,inserted 存放新值。
  • IF UPDATE(ColumnName) 偵測特定欄位是否被修改,精確控制觸發邏輯。
  • 範例:防止單價變動超過 30%
    CREATE TRIGGER Price_Guard ON Products FOR UPDATE AS
    IF UPDATE(UnitPrice)
    BEGIN
        IF EXISTS (SELECT * FROM Inserted I JOIN Deleted D ON I.ProductID = D.ProductID
                   WHERE I.UnitPrice > D.UnitPrice * 1.3 OR I.UnitPrice < D.UnitPrice * 0.7)
        BEGIN
            RAISERROR('單價變動超過 30%,交易回滾', 16, 1);
            ROLLBACK TRANSACTION;
        END
    END

INSTEAD OF 觸發器 (SQL Server 2000 新增)

  • 取代原 DML 動作,不自動修改基底表,完全由觸發器邏輯決定是否/如何寫入。
  • 可定義於**視圖**上,實現多基底表視圖的可更新性(如 Customers+Orders+OrderDetails 聯合視圖)。
  • 效能較 AFTER 觸發器低(需在觸發器內手動執行 DML),適用於複雜業務驗證、跨表同步等場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved