PL / SQL触发器在更新或插入后更新同一个表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL / SQL触发器在更新或插入后更新同一个表相关的知识,希望对你有一定的参考价值。

我需要帮助触发器或类似的东西。问题是,我有几行具有相同的id,并且有一个名为status的列。这些行中只有一行可以同时“活动”。在将一行更新为“活动”后,如何将所有其他人更改为“非活动”。

答案

正如评论中所建议的那样,您应该在存储过程中执行此操作,该过程可能如下所示:

create or replace procedure prc_ActivateThingy(p_Id number) as
begin
  update YourThingy t
  set t.Active = 'Y'
  where
    t.Id = p_Id;

  dbms_output.put_line(sql%rowcount);

  if sql%rowcount = 0 then
    raise_application_error(-20000, 'No thingy found with id ' || p_Id || '.');
  end if;

  update YourThingy t
  set t.Active = 'N'
  where t.Id <> p_Id;

  dbms_output.put_line(sql%rowcount);
end;

在触发器中执行此操作也会起作用,但如果存在太多“触发魔法”,最终您的应用程序将难以维护。预测什么时候会发生火灾变得更加困难,而且你可能陷入混乱,使得很难实现新的业务逻辑或技术重构。

因此,为了完整性,这是如何在复合触发器中执行此操作,尽管再次建议选择上面的选项。

create or replace trigger tiuc_YourThingy
for insert or update on YourThingy
compound trigger

  v_Id number;

  before each row is
  begin
    v_Id := null;
    if :new.Active = 'Y' then
      v_Id := :new.Id;
    end if;
  end before each row;

  after statement is
  begin
    if v_Id is not null then
      update YourThingy t
      set
        t.ACTIVE = 'N'
      where
        t.ID <> v_Id;
    end if;
  end after statement;

end;

以上是关于PL / SQL触发器在更新或插入后更新同一个表的主要内容,如果未能解决你的问题,请参考以下文章

更新同一表中的值的 PL/SQL 插入和删除触发器

PL/SQL 触发器插入下一个值

Postgres SQL 触发器在 TableB 上插入或更新后使用新值更新 TableA.column

如何创建在 PL/SQL 中更新后触发的触发器

postgresql 上的更新类型

PL/SQL ORACLE:删除时触发更新