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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当isedit !=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

但我觉得没什么意义.

答案
  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中基本上会执行插入和删除操作。

因此,当你执行更新时,它会删除你的原始记录,并将其保存在名为 "删除 "的逻辑表下,并从名为 "插入 "的逻辑表中插入一条新的记录。

通过这种方式,你可以从表'删除'中获取值,并确定列的值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 !=1时,在更新时触发,防止更新。的主要内容,如果未能解决你的问题,请参考以下文章

useEffect - 更新状态时防止无限循环

防止 updateUIView 在 @State var 更改时更新视图

路由基础之RIP的水平分割及触发更新

当 Value = GETDATE() 时触发更新记录

触发器-当一个表更新时,将数据插入另一张表中

更新 ViewModel 时如何防止 Kendo UI Grid 多次重新绑定