Sql server 更新时触发以防止isedit时更新!=1.

Sql server 更新时触发以防止isedit时更新!=1.,sql-server,tsql,database-trigger,Sql Server,Tsql,Database Trigger,我有一张桌子: 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

我有一张桌子:

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
但我认为这没有多大意义

使用基于集合的逻辑,考虑到插入的记录可以有多条或零条。 如果更新无效,请使用“回滚”撤消更新。 要允许您设置和清除isedit,因为您将其更新为单列更新,所以可以使用updatecolumn函数测试对该列的更改并允许其通过。 请试试这个逻辑。 当您尝试更新某些内容时,插入和删除操作将在SQL中执行

因此,在执行更新时,它会删除原始行并将其保留在名为“deleted”的逻辑表下,并从名为“inserted”的逻辑表中插入新行

通过这种方式,您可以从“已删除”表中获取值,并标识列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

谢谢,还有一件事,如何才能将isedit从0更新为1?因为该触发器也会阻止该更改,对吗?@uberxeq这取决于您如何更新iEdit-您自己更新它吗?还是其他栏目?向我展示您使用的实际update语句。[code]update base SET isedit=0其中id=@id[/code]它是存储过程的一部分。这也是一种很好的做法,可以为您的答案添加一些解释,以便OP了解一些东西,而不仅仅是为他们编写代码。
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