Ok. I am quite new to SQL triggers and have had some issues with them. Insert trigger works just fine, and the Delete trigger also. At first, doing a delete on multiple rows would only delete one, but I managed to figure that one out for myself :)
好。我对SQL触发器很新,并且遇到了一些问题。插入触发器工作正常,还有删除触发器。首先,在多行上执行删除只会删除一行,但我设法为自己找出一个:)
However, even after extensive searching (here and on Google) I am unable to find a satisfactory answer to the UPDATE trigger that I have. If I do an update like
然而,即使经过广泛搜索(此处和谷歌),我也无法找到我所拥有的UPDATE触发器的满意答案。如果我做更新,如
UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3
Then unfortunately, only the one record would be updated, and the other would remain as they were. Obviously, this is no good.
然后不幸的是,只有一条记录会被更新,而另一条记录将保持不变。显然,这不好。
The trigger I am using is:
我使用的触发器是:
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
As you will immediately realize, this trigger is great - if you want to update just one record. Otherwise, it fails. Now - the main question here would be - How do I catch all the records that need updating, and update them all in one trigger action.
正如您将立即意识到的那样,此触发器很棒 - 如果您只想更新一条记录。否则,它会失败。现在 - 这里的主要问题是 - 如何捕获所有需要更新的记录,并在一个触发操作中更新所有记录。
The examples I have seen here on Stack Overflow confuse me somewhat, or seem ineffective - for instance, it seems most of them deal with updating just ONE value in a second/other table, and not a whole bunch like I am trying to do. The ones that appear to work on multiple values, I can not understand :(
我在Stack Overflow上看到的例子让我感到有些困惑,或者看起来效果不好 - 例如,似乎大多数例子只处理在第二个/另一个表中更新一个值,而不是像我想做的那样整个。似乎在多个值上工作的那些,我无法理解:(
So after about 2 hours of searches, I give up, and hope that you can help me :) I realize this is a trigger-newbie issue, and though I know my MS-SQL, triggers are something I have never used, until now. So any help is greatly welcome :) W
所以经过大约2个小时的搜索,我放弃了,希望你能帮助我:)我意识到这是一个触发器 - 新手问题,虽然我知道我的MS-SQL,触发器是我从未使用过的东西,直到现在。所以任何帮助都非常欢迎:) W
1 个解决方案
#1
14
It seems that you need something like this
看来你需要这样的东西
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
Since inserted
virtual table can contain multiple rows you need to JOIN
it to correctly do your UPDATE
.
由于插入的虚拟表可以包含多行,因此需要将其加入以正确执行更新。
#1
14
It seems that you need something like this
看来你需要这样的东西
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
Since inserted
virtual table can contain multiple rows you need to JOIN
it to correctly do your UPDATE
.
由于插入的虚拟表可以包含多行,因此需要将其加入以正确执行更新。