2011-10-18 105 views
0

我在MsSQL中遇到了INSTEAD OF觸發器問題。我有一個應用程序出現了一些錯誤,作爲一個快速的解決方法,我不希望用戶修改數據庫中的一個確切的行。 我創建了以下觸發:(上表)MsSQL DB上的INSTEAD OF UPDATE觸發器的默認操作

create trigger UglyWorkaround ON Configuration instead of update 
    as 
    begin 
     if (select COUNT(1) from inserted where Key='Key01' and Value<>'2') > 0 begin 
      update Configuration set Value='2' where Key='Key01' 
     end else begin 
      -- DEFAULT ACTION (do update as intended) 
     end; 


    end; 

但我有問題,確定如何設置默認操作。 Update Configuration set Value=inserted.Value where Key=inserted.Key不適合我。有什麼辦法如何用觸發器做到這一點? (我知道解決的辦法是不好的,但我沒有其他的選擇,因爲我現在不能更改密碼。)

+0

你說你**不**要修改特定行,但你的代碼當Key ='Key01''時改變'Value'。 – Tony

+0

它改變了價值回來的情況下,用戶將其改變爲我想要的其他值。也許我沒有明白觸發器的原理 – nothrow

+0

@Yossarian,你使用'而不是update'觸發器,所以SQL Server不會更新那行,你不需要擔心把它改回來。 –

回答

3

inserted是一個表,所以試着加入:

update c set c.Value = i.Value 
from Configuration c 
    inner join inserted i on c.Key = i.Key 

您還可以篩選出Key01在同一時間,如果他們試圖將Key01的值更新爲2以外的值,則無關緊要。

update c set c.Value = i.Value 
from Configuration c 
    inner join inserted i on c.Key = i.Key 
where i.Key <> 'Key01' 
0

如果你想防止編輯執行上的變化rollback,爲什麼你要爲Value='2',當你發現一個匹配的行?

您不必提供默認操作,在觸發器中無所作爲會讓更新發生。

+0

這是一個INSTEAD OF觸發器,而不是一個觸發器 –

1

INSTEAD OF部分意味着您將不得不更新其他列以及值。

沒有必要用,如果要做到這一點..其他的邏輯可以在列級進行

create trigger NicerWorkaround ON Configuration instead of update 
as 
begin 

update c set 
c.Value = CASE WHEN i.Key='Key01' THEN '2' ELSE i.Value END, 
c.OtherColumn1 = i.OtherColumn1, 
c.OtherColumn2 = i.OtherColumn2 
from Configuration c 
inner join inserted i on c.Key = i.Key  
END; 
相關問題