共用方式為


建立 DML 觸發程式

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

本文說明如何使用 SQL Server Management Studio 或 Transact-SQL CREATE TRIGGER 語句建立 Transact-SQL 數據作語言 (DML) 觸發程式。

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

局限性

如需建立 DML 觸發程式的相關限制清單,請參閱 CREATE TRIGGER

權限

ALTER需要建立觸發程式之數據表或檢視表的許可權。

如何建立 DML 觸發程式

您可以使用下列其中一個方法:

使用 SQL Server Management Studio

  1. 在 [物件總管] 中,連線至資料庫引擎的執行個體,然後展開該執行個體。

  2. 序展開 [資料庫]、[ AdventureWorks2025 資料庫]、[ 數據表] 和 [數據表 Purchasing.PurchaseOrderHeader]。

  3. 以滑鼠右鍵按一下 [觸發程序],然後選取 [新增觸發程序]

  4. 在 [查詢] 功能表上,選取 [指定範本參數的值]。 您也可以按 (Ctrl-Shift-M) 開啟 [指定範本參數的值] 對話方塊。

  5. [指定範本參數的值] 對話方塊中,為顯示的參數輸入下列值。

    參數
    Author 您的名字
    建立日期 今天的日期
    說明 先檢查供應商信用評等,再允許插入含有該供應商的新採購單。
    Schema_Name Purchasing
    Trigger_Name NewPODetail2
    Table_Name PurchaseOrderDetail
    Data_Modification_Statement 從清單移除 UPDATEDELETE
  6. 請選擇 [確定]

  7. 在 [查詢編輯器] 中,將 -- Insert statements for trigger here 註解取代為下列陳述式:

    IF @@ROWCOUNT = 1
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + LineTotal
        FROM inserted
        WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID;
    END
    ELSE
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + (SELECT SUM(LineTotal)
            FROM inserted
            WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID)
        WHERE PurchaseOrderHeader.PurchaseOrderID IN (SELECT PurchaseOrderID
        FROM inserted);
    END;
    
  8. 若要確認語法是否有效,請在 [ 查詢 ] 功能表上,選取 [ 剖析]。 如果傳回錯誤訊息,請比較 語句與先前的程式代碼區塊、視需要更正,然後重複此步驟。

  9. 若要建立 DML 觸發程式,請從 [查詢 ] 功能選取 [ 執行]。 DML 觸發器會建立為資料庫中的物件。

  10. 若要查看物件總管中所列的 DML 觸發程序,請以滑鼠右鍵按一下 [觸發程序],然後選取 [重新整理]

使用 Transact-SQL

  1. 在 [物件總管] 中,連線至資料庫引擎的執行個體,然後展開該執行個體。

  2. 從 [ 檔案] 功能表中,選取 [ 新增查詢]。

  3. 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。 此範例會建立與之前相同的預存 DML 觸發程式。 觸發程式適用於多列和單一數據列插入,而且最適合單一數據列插入。

    USE AdventureWorks2022;
    GO
    
    CREATE TRIGGER NewPODetail3
    ON Purchasing.PurchaseOrderDetail
    FOR INSERT AS
    IF @@ROWCOUNT = 1
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + LineTotal
        FROM inserted
        WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID;
    END
    ELSE
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + (SELECT SUM(LineTotal)
            FROM inserted
            WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID)
        WHERE PurchaseOrderHeader.PurchaseOrderID IN (SELECT PurchaseOrderID
        FROM inserted);
    END;