Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle

Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:10 #1596

  • Bella
  • Bella аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Собственно, вот - это нормально? Как бороться?
Oracle 9.2.0.6.
Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:26 #1597

  • Chlo
  • Chlo аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 43
  • Спасибо получено: 0
merge_update_clause
If the update clause is executed, then all update triggers defined on the target table are activated.

merge_insert_clause
If the insert clause is executed, then all insert triggers defined on the target table are activated.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:27 #1598

  • Bella
  • Bella аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Понимаете... Для решения проблемы хватило бы флага merging типа inserting, updating и deleting, но его нету...

Что имеют в виду - "If the insert clause is executed"? Если даже вставка в операторе merge не отработала, то тригер все равно выполняется два раза - inserting и updating.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Bella.

Re: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:29 #1599

  • Chlo
  • Chlo аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 43
  • Спасибо получено: 0
Различай STATEMENT-level и ROW-level триггеры.
SQL> create table test(id number);

Table created.

SQL> create trigger biu_test before insert or update on test
  2  begin
  3  dbms_output.put_line('TRIGGER FIRED');
  4  end;
  5  /

Trigger created.

SQL> set serveroutput on
SQL> insert into test values(1);
TRIGGER FIRED

1 row created.

SQL> insert into test select null from dual where 1=0;
TRIGGER FIRED

0 rows created.

SQL> update test set id=null where id=null;
TRIGGER FIRED

0 rows updated.

SQL> alter table test add (n number);

Table altered.

SQL> merge into test using (select -1 id from dual where 1=0) q
  2  on (test.id=q.id)
  3  when matched then update set n=-1
  4  when not matched then insert values(q.id,-2)
  5  /
TRIGGER FIRED
TRIGGER FIRED

0 rows merged.

SQL>

В общем так: если стейтмент есть, то такой триггер выполняется НЕЗАВИСИМО от того, будут ли этим стейтментом обработаны строчки (что правильно - зачем выполнять INSERT AS SELECT с запросом, требующим пары часов времени, если триггером BEFORE INSERT вставка в таблицу запрещена?).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:31 #1600

  • Bella
  • Bella аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Согласна со всем сказанным. Но существует реальная ситуация - есть некая таблица, над строками которой производят действия командами INSERT, UPDATE и MERGE. Есть триггеры на данную таблицу - BEFORE STATEMENT, FOR EACH ROW и AFTER STATEMENT проводящие анализ произведенных изменений. По тригеру AFTER STATEMENT происходит вызов процедуры, сохраняющей данные анализа. Вот и получается, что в случае с INSERT и UPDATE вся эта конструкция отрабатывает как надо, а в случае MERGE процедура вызывается дважды после всего блока произведенных изменений, а не по разу после каждого подблока, что не есть хорошо. Вот и все.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Дважды срабатывает Тригер BEFORE/AFTER STATEMENT в Oracle 12 июль 2011 07:31 #1601

  • Chlo
  • Chlo аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 43
  • Спасибо получено: 0
А то, что FOR EACH ROW триггеры могут срабатывать несколько раз Вы учитываете? Если да, то ничто не помешает учитывать и двойное срабатывание триггеров уровня стейтмента. Если нет - то пересматривайте концепцию.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3