Применение составных триггеров Oracle 11g

У меня просто очень быстрый вопрос об использовании составных триггеров.

Я очень новичок в базе данных/sql/oracle, и у меня есть задача uni, в которой мне пришлось создавать триггеры для следующего:

  1. Вставить в таблицу журнала, когда продавец создает заказ
  2. Обновление в таблице заказов, когда заказ готов к отправке (плюс вставка в журнал)
  3. Запретить INSERT, UPDATE, DELETE после 17:00 пятницы до 9:00 понедельника.

Я успешно реализовал триггеры, но только что узнал о составных триггерах в 11g. Было бы уместно рассмотреть возможность объединения вышеперечисленного в один составной триггер? Это то, для чего они нужны, или я упускаю суть?

Большое спасибо за рассмотрение этого довольно расплывчатого вопроса.


person Dylan Jackson    schedule 15.05.2012    source источник


Ответы (2)


ИМО это было бы неуместно. Составной триггер позволяет вам перехватывать четыре разных триггерных точки (до оператора, до действия, после действия и после оператора) для данного действия в данной таблице, но это выглядит так: А) вы запускаете несколько таблиц и Б) вам не нужно обслуживать все триггерные точки. (Кстати, «действие», как я его здесь использовал, может означать разные типы операторов, например, ПЕРЕД ВСТАВКОЙ, ОБНОВЛЕНИЕМ, УДАЛЕНИЕМ...).

Составные триггеры представляют собой приятный, чистый и компактный способ обойти непопулярную ошибку ORA-04091 MUTATING TABLE, но по большей части я не нахожу их необходимыми или полезными в качестве универсальной замены «обычные» триггеры. Например, см. мой ответ на этот вопрос.

Делитесь и наслаждайтесь.

person Bob Jarvis - Reinstate Monica    schedule 15.05.2012
comment
Ясно, поэтому (и, конечно же, это проект uni, и нам всегда говорили, что нужно нажимать на функциональность огромной базы данных с массой триггеров/таблиц/кортежей), было бы неправильно использовать составные триггеры для проверки даты и времени (триггер 3) перед вставкой в ​​лог-таблицу(триггеры 1 и 2)? - person Dylan Jackson; 15.05.2012
comment
Правильность определить сложно :-), но лично я бы не хотел идти по этому пути, в основном из-за всех триггерных точек, которые вам на самом деле не нужны. Я полагаю, что 1 и 2 будут триггером строки AFTER INSERT, а 3 будет триггером оператора BEFORE INSERT, UPDATE, DELETE. Тем не менее, глядя на это, я бы с подозрением относился к выполнению 2 и 3 в триггерах — первое правило триггеров (ну, ладно, МОЕ первое правило триггеров) — не реализовывать бизнес-логику в Твои триггеры, ибо это скользкий склон на холмах над рекой Безумие!. YMMV. - person Bob Jarvis - Reinstate Monica; 15.05.2012

вау - составные триггеры - даже не знал, что они существуют...

Я быстро просмотрел документацию.

Основная причина использования составных триггеров объясняется следующим образом:

Составной триггер упрощает программирование подхода, при котором вы хотите, чтобы действия, которые вы реализуете для различных моментов времени, имели общие данные. Чтобы добиться такого же эффекта с помощью простых триггеров, вам пришлось моделировать общее состояние с помощью вспомогательного пакета. Этот подход был громоздким для программирования и подвержен утечке памяти, когда триггерный оператор вызывал ошибку, а триггер после оператора не срабатывал.

Поэтому, если вам не нужны переменные пакета для реализации вашей функциональности, не будет причин для их использования. И ваш код больше не будет совместим с 10g.

person HAL 9000    schedule 15.05.2012
comment
Спасибо. Я видел эту документацию ... но, будучи относительным «нубом», я не совсем ее понял :/ - person Dylan Jackson; 15.05.2012