MsSQL DB上的INSTEAD OF UPDATE触发器的默认操作

时间:2011-10-18 14:43:49

标签: sql-server triggers

我在MsSQL中遇到了INSTEAD OF触发器的问题。我有一个错误的应用程序,作为一个快速的解决方法,我不希望用户修改数据库中的一个确切的行。 我创建了以下触发器:(在桌面上)

 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对我不起作用。有什么方法可以用触发器做到这一点吗? (我知道解决方案很糟糕,但我没有其他选择,因为我现在无法更改代码。)

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

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

没有必要使用if .. else执行此操作,因为逻辑可以在列级别完成

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;

答案 2 :(得分:0)

如果您想阻止修改对更改执行rollback,为什么在找到匹配的行时设置Value='2'

您不必提供默认操作,在触发器中不执行任何操作会让更新发生。