当isedit !=1时,在更新时触发,防止更新。

问题描述 投票:0回答:1

我有一个表。

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

但我觉得没什么意义.

sql-server tsql database-trigger
1个回答
1
投票
  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

0
投票

请试试这个逻辑。当你试图更新一些东西的时候,在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
© www.soinside.com 2019 - 2024. All rights reserved.