我有一个表。
ID NAME isedit
1 jon 0
2 smit 1
3 eve 0
我需要创建一个触发器,以防止该行被更新,当。isedit
不是1。
然而,它必须允许我设置 isedit
首先,例如
update base SET isedit = 0 WHERE id = @id
我试过下面的方法。
CREATE TRIGGER dbo.onupdate
ON base
AFTER UPDATE
AS
BEGIN
If (SELECT isedit FROM base) NOT LIKE '1'
Begin
Return
END
END
但我觉得没什么意义.
Inserted
可以有多条(或零条)记录。rollback
来撤销无效的更新。isedit
因为你以单列更新的方式更新它,你可以使用 update(column)
函数来测试该列的变化并允许其通过。 create trigger dbo.onupdate
on base
after update
as
begin
set nocount on;
if not update(isedit) and exists (
select 1
from Inserted I
where isedit != 1
) begin
rollback;
end;
end
请试试这个逻辑。当你试图更新一些东西的时候,在SQL中基本上会执行插入和删除操作。
因此,当你执行更新时,它会删除你的原始记录,并将其保存在名为 "删除 "的逻辑表下,并从名为 "插入 "的逻辑表中插入一条新的记录。
通过这种方式,你可以从表'删除'中获取值,并确定列的值isEdit !=1,那么它将抛出一个错误与回滚事务。
Create TRIGGER [dbo].onupdate
ON [dbo].base
FOR UPDATE
AS
IF EXISTS(SELECT NULL FROM deleted where isEdit <> 1)
BEGIN
RAISERROR('You can not update when isEdit value is 1', 16, 1)
ROLLBACK TRAN
END