2013-05-18 237 views
8

好的。我對SQL觸發器很陌生,並且遇到了一些問題。插入觸發器工作得很好,還有刪除觸發器。起初,多行刪除只會刪除一個,但我設法爲自己找出一個:)多行更新SQL觸發器從單一更新SQL語句

但是,即使經過大量搜索(這裏和谷歌),我無法找到滿意的答案到我擁有的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的例子讓我有些困惑,或者看起來沒有效果 - 例如,它們大部分似乎只處理第二個/其他表中的ONE值,而不是像我一樣試圖去做。那些似乎工作在多個值,我不明白:(

因此經過約2小時的搜索,我放棄了,並希望你能幫助我:)我意識到這是一個觸發器 - 新手問題,儘管我知道我的MS-SQL,但觸發器是我迄今爲止從未使用過的。因此,任何幫助是極大的歡迎:) W¯¯

+0

「插入」表可以包含多行。我建議大家不要使用觸發器。他們很難得到正確的結果,即使你管理,結果也很難保持。 – Andomar

+0

那麼......我理論上可以用更新後的SQL語句進行更新,只要INSERT和DELETE能夠正常工作,這將是可能的第二好的解決方案。但我仍然非常想知道如何使這個觸發器正確...我只使用一組觸發器,因爲在這種情況下,它正是我所需要的,並提供最佳解決方案:)感謝您的評論。 – Irresistance

+0

@阻抗觸發器是許多原因的非首選解決方案。正如Andromar所說,他們很難寫和維護。它們也對INSERT,UPDATE和DELETE的性能產生不利影響,使事務更復雜,可能增加死鎖的機會,並且對於操作任務來說是一個真正的痛苦。但最大的原因是他們隱藏在正常的視野之下,使他們有效的「魔術」。觸發器不斷讓DBA和開發人員感到不安,因爲他們忘記了它們,導致許多漫長而令人困惑的支持問題以「該表是否有任何觸發器?」結尾。 – RBarryYoung

回答

13

看來,你需要像這樣

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

+0

你達人!這正是我所需要的,並且我爲了不提出這個明顯而優雅的解決方案而反省自己! – Irresistance

+0

@ peterm,我有同樣的問題,可以請查看以下鏈接http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26143185#26143185 – Prathyush