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

SQL Server INSTEAD OF 觸發器實戰:建立可更新檢視表

     編輯:關於SqlServer

SQL Server 2005 提供三類觸發器:AFTER、DDL、INSTEAD OF。INSTEAD OF 觸發器可攔截 DML 操作(INSERT/UPDATE/DELETE)並自訂邏輯,常用於實現「可更新檢視表」。本文以 Products、Purchases 兩表為例,示範建立聯結檢視表並透過 INSTEAD OF INSERT 觸發器將新增資料分派到基底表。

範例情境

  • Products(產品主檔)、Purchases(採購明細)。
  • 建立檢視表 vw_ProductPurchases 聯結兩表。
  • 直接對檢視表 INSERT 會失敗(因涉及多個基底表)。

解決方案:INSTEAD OF 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 可能多列)、錯誤交易回滾、效能考量。
  • INSTEAD OF 也可用於攔截刪除/更新實現軟刪除、稽核等進階邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved