共用方式為


建立 DML 觸發程序

此主題描述如何使用 SQL Server Management Studio 以及使用 Transact-SQL CREATE TRIGGER 陳述式來建立 Transact-SQL DML 觸發程序。

開始之前

限制事項

如需與建立 DML 觸發程序相關之限制事項的清單,請參閱<CREATE TRIGGER (Transact-SQL)>。

權限

需要建立觸發程序之資料表或檢視的 ALTER 權限。

如何建立 DML 觸發程序

您可以使用下列其中一項:

  • SQL Server Management Studio

  • Transact-SQL

使用 SQL Server Management Studio

  1. [物件總管] 中,連接到 Database Engine 的執行個體,然後展開該執行個體。

  2. 依序展開 [資料庫]、 AdventureWorks2012 資料庫、[資料表]Purchasing.PurchaseOrderHeader 資料表。

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

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

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

    參數

    作者

    Your name

    建立日期

    Today's date

    說明

    先檢查供應商信用評等,再允許插入含有該供應商的新採購單。

    Schema_Name

    Purchasing

    Trigger_Name

    NewPODetail2

    Table_Name

    PurchaseOrderDetail

    Data_Modification_Statement

    從清單中移除 UPDATE 和 DELETE。

  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. [物件總管] 中,連接到 Database Engine 的執行個體,然後展開該執行個體。

  2. [檔案] 功能表中,按一下 [新增查詢]

  3. 將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。 此範例會建立與上面相同的預存 DML 觸發程序。

    -- Trigger valid for multirow and single row inserts
    -- and optimal for single row inserts.
    USE AdventureWorks2012;
    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;
    

[回到頁首]