创建 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. 对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。

  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. 对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。

  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;
    

[返回页首]