Триггер PL / SQL для обновления той же таблицы после обновления или вставки - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужна помощь для запуска или что-то в этом роде. Проблема в том, что у меня есть несколько строк с одинаковым идентификатором, и есть столбец с именем status. Только одна из этих строк может быть «активной» одновременно. Как изменить все остальные значения на «неактивные» после обновления строки на «активные».

1 Ответ

2 голосов
/ 29 апреля 2019

Как предлагается в комментариях, вы должны сделать это в хранимой процедуре, которая может выглядеть примерно так:

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;
...