好的。我對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¯¯
「插入」表可以包含多行。我建議大家不要使用觸發器。他們很難得到正確的結果,即使你管理,結果也很難保持。 – Andomar
那麼......我理論上可以用更新後的SQL語句進行更新,只要INSERT和DELETE能夠正常工作,這將是可能的第二好的解決方案。但我仍然非常想知道如何使這個觸發器正確...我只使用一組觸發器,因爲在這種情況下,它正是我所需要的,並提供最佳解決方案:)感謝您的評論。 – Irresistance
@阻抗觸發器是許多原因的非首選解決方案。正如Andromar所說,他們很難寫和維護。它們也對INSERT,UPDATE和DELETE的性能產生不利影響,使事務更復雜,可能增加死鎖的機會,並且對於操作任務來說是一個真正的痛苦。但最大的原因是他們隱藏在正常的視野之下,使他們有效的「魔術」。觸發器不斷讓DBA和開發人員感到不安,因爲他們忘記了它們,導致許多漫長而令人困惑的支持問題以「該表是否有任何觸發器?」結尾。 – RBarryYoung