我在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
对我不起作用。有什么方法可以用触发器做到这一点吗? (我知道解决方案很糟糕,但我没有其他选择,因为我现在无法更改代码。)
答案 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'
?
您不必提供默认操作,在触发器中不执行任何操作会让更新发生。