创建 DML 触发器

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本主题介绍了如何通过使用 SQL Server Management Studio 和 Transact-SQL CREATE TRIGGER 语句来创建 Transact-SQL DML 触发器。

开始之前

限制和局限

有关与创建 DML 触发器相关的限制和局限的列表,请参阅 CREATE TRIGGER (Transact-SQL)

权限

需要对要创建触发器的表或视图具有 ALTER 权限。

如何创建 DML 触发器

你可以使用以下项之一:

使用 SQL Server Management Studio

  1. “对象资源管理器” 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 “数据库”,展开 AdventureWorks2022 数据库,展开 “表” ,然后展开表 Purchasing.PurchaseOrderHeader

  3. 右键单击“触发器”,然后选择“新建触发器”

  4. “查询” 菜单上,单击 “指定模板参数的值” 。 或者,你可以按下 (Ctrl-Shift-M) 以便打开“指定模板参数的值”对话框。

  5. “指定模板参数的值” 对话框中,输入下列所示的参数值。

    参数
    作者 你的姓名
    创建日期 今天的日期
    说明 在允许插入具有供应商的新采购订单之前,请检查供应商信用等级。
    Schema_Name 购买
    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. “对象资源管理器” 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. “文件” 菜单中,单击 “新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。 此示例将创建与上面相同的存储的 DML 触发器。

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