创建 DML 触发器

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

本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL CREATE TRIGGER 语句创建 Transact-SQL 数据作语言(DML)触发器。

本文中的代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

局限性

有关与创建 DML 触发器相关的限制列表,请参阅 CREATE TRIGGER

权限

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

如何创建 DML 触发器

可以使用下列方法之一:

使用 SQL Server Management Studio

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

  2. 展开 数据库,展开 AdventureWorks2022 数据库,展开 ,然后展开表 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;