创建 DML 触发器
本主题介绍如何使用 SQL Server Management Studio 和 Transact-SQL CREATE TRIGGER 语句创建 Transact-SQL DML 触发器。
开始之前
限制和局限
有关与创建 DML 触发器相关的限制和限制的列表,请参阅 CREATE TRIGGER (Transact-SQL) 。
权限
需要对要创建触发器的表或视图具有 ALTER 权限。
如何创建 DML 触发器
您可以使用以下项之一:
使用 SQL Server Management Studio
在 “对象资源管理器” 中,连接到 数据库引擎 的实例,然后展开该实例。
依次展开“数据库”、“AdventureWorks2012”数据库、“表”和“Purchaseing.PurchaseOrderHeader”表。
右键单击“触发器”,然后选择“新建触发器”。
在 “查询” 菜单上,单击 “指定模板参数的值” 。 或者,你可以按下 (Ctrl-Shift-M) 以便打开“指定模板参数的值”对话框。
在 “指定模板参数的值” 对话框中,输入下列所示的参数值。
参数 值 作者 您的姓名 创建日期 今天的日期 说明 在允许插入具有供应商的新采购订单之前,请检查供应商信用等级。 Schema_Name 购买 Trigger_Name NewPODetail2 Table_Name PurchaseOrderDetail Data_Modification_Statement 从列表中删除 UPDATE 和 DELETE。 单击“确定”。
在 “查询编辑器”中,使用以下语句替换注释
-- 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;
若要验证语法是否有效,请在 “查询” 菜单上单击 “分析”。 如果返回错误消息,则请将该语句与上述信息进行比较,视需要进行更正并且重复此步骤。
若要创建 DML 触发器,请在 “查询” 菜单上单击 “执行”。 该 DML 触发器作为数据库中的对象创建。
若要查看在“对象资源管理器”中列出的 DML 触发器,请右键单击“触发器”,然后选择“刷新”。
“使用 Transact-SQL”
在 “对象资源管理器” 中,连接到 数据库引擎 的实例,然后展开该实例。
从 “文件” 菜单中,单击 “新建查询” 。
将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。 此示例将创建与上面相同的存储的 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;