当 isedit != 1 时触发更新以防止更新

Trigger on update to prevent update when isedit != 1

我有一个 table:

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

不过我觉得没什么意义。

  1. 考虑到 Inserted 可以有多个(或零个)记录,使用基于集合的逻辑。
  2. 使用 rollback 在更新无效时撤消更新。
  3. 允许您设置和清除 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 中执行。

因此,当您执行更新时,它会删除您的原始行并将其保留在名称 'deleted' 的逻辑 table 下,并从名称 table 的逻辑 table 插入一个新行姓名 'inserted'.

通过这种方式,您可以从 table 'deleted' 中获取值并识别列的值 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