单个更新SQL语句的多行更新SQL触发器

时间:2013-05-18 13:52:16

标签: sql sql-server triggers recordset

确定。我对SQL触发器很新,并且遇到了一些问题。插入触发器工作正常,还有删除触发器。首先,对多行进行删除只会删除一行,但我设法为自己找出一个:)

然而,即使经过大量搜索(此处和Google上),我也无法找到我所拥有的UPDATE触发器的满意答案。如果我做了像

这样的更新
UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3

然后不幸的是,只有一条记录会被更新,而另一条记录会保持不变。显然,这不好。

我使用的触发器是:

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers]

FOR UPDATE

AS
declare @customerid int;
declare @customervenue int;
declare @customeruser int;
declare @customerarea int;
declare @customerevent int;
declare @customerproject int;
declare @customerstatus int;

select @customerid=i.CustomerID from inserted i;
select @customervenue=i.CustomerVenue from inserted i;
select @customerarea=i.CustomerArea from inserted  i;
select @customerevent=i.CustomerEvent from inserted i;
select @customerproject=i.CustomerProject from inserted i;
select @customeruser=i.CustomerUser from inserted i;
select @customerstatus=i.CustomerStatus from inserted i;

Update USER_Instances Set InstanceArea = @customerarea, InstanceVenue = @customervenue, InstanceUser = @customeruser, InstanceStatus = @customerstatus, InstanceEvent = @customerevent, InstanceLastUpdate = GetDate() Where InstanceObject = 17 AND InstanceIdentity = @customerid
GO

正如您将立即意识到的那样,此触发器非常棒 - 如果您只想更新一条记录。否则,它失败了。现在 - 这里的主要问题是 - 如何捕获所有需要更新的记录,并在一个触发操作中更新所有记录。

我在Stack Overflow上看到的例子让我感到有些困惑,或者看起来效果不好 - 例如,似乎大多数例子只处理在第二个/另一个表中更新一个值,而不是像我正在尝试的那样一堆去做。似乎在多个值上工作的那些,我无法理解:(

所以经过大约2个小时的搜索,我放弃了,希望你能帮助我:)我意识到这是一个触发器 - 新手问题,虽然我知道我的MS-SQL,触发器是我从未使用过的东西, 到现在。所以任何帮助都非常欢迎:) w ^

1 个答案:

答案 0 :(得分:16)

似乎你需要这样的东西

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers]
FOR UPDATE
AS
UPDATE USER_Instances
   SET InstanceArea = i.CustomerArea, 
       InstanceVenue = i.CustomerVenue, 
       InstanceUser = i.CustomerUser, 
       InstanceStatus = i.CustomerStatus, 
       InstanceEvent = i.CustomerEvent, 
       InstanceLastUpdate = GetDate() 
  FROM USER_Instances JOIN inserted i
    ON InstanceIdentity = i.CustomerID AND InstanceObject = 17

由于inserted虚拟表可以包含多行,您需要JOIN才能正确执行UPDATE