SQL Server 2005 提供三類觸發器:AFTER、DDL、INSTEAD OF。INSTEAD OF 觸發器可攔截 DML 操作(INSERT/UPDATE/DELETE)並自訂邏輯,常用於實現「可更新檢視表」。本文以 Products、Purchases 兩表為例,示範建立聯結檢視表並透過 INSTEAD OF INSERT 觸發器將新增資料分派到基底表。
Products(產品主檔)、Purchases(採購明細)。vw_ProductPurchases 聯結兩表。INSERT 會失敗(因涉及多個基底表)。CREATE TRIGGER tr_vw_ProductPurchases_INS
ON vw_ProductPurchases
INSTEAD OF INSERT
AS
BEGIN
-- 從 inserted 取得新資料
DECLARE @ProductID INT, @Description VARCHAR(75), @Price MONEY,
@PurchasePrice MONEY, @PurchaseDate SMALLDATETIME;
SELECT @ProductID = i.ProductID, @Description = i.Description,
@Price = i.ProductPrice, @PurchasePrice = i.PurchasePrice,
@PurchaseDate = ISNULL(i.PurchaseDate, GETDATE())
FROM inserted i;
-- 新增/更新 Products
IF NOT EXISTS (SELECT 1 FROM Products WHERE ProductID = @ProductID)
INSERT INTO Products (ProductID, Description, Price)
VALUES (@ProductID, @Description, @Price);
-- 新增 Purchases
INSERT INTO Purchases (ProductID, PurchasePrice, PurchaseDate)
VALUES (@ProductID, @PurchasePrice, @PurchaseDate);
END;
inserted 可能多列)、錯誤交易回滾、效能考量。