Эффективное программирование на PL/SQL - Отключенные триггеры

ОГЛАВЛЕНИЕ

Отключенные триггеры

В широко распространённых производственных системах часто используется окно для редактирования, с помощью которого вносятся изменения. Вот сценарий типичной несостоявшийся "Catch-22" [ упоминание известного романа Джозеф а Хеллер а " Уловка-22 " - прим.ред . ] в таких средах: вы хотите добавить триггер на таблицу и для этого применяете скрипт, однако, когда триггер создан в редакторе, он показывает ошибки компиляции из-за некоторых нежелательных причин, например, пропущенного синонима. Вы хотите создать триггер раньше синонима, но когда он создаётся, то сразу включается, и вы ничего не можете сделать вне этого редактора. Что в этом случае можно предпринять?

В Oracle Database 11 g этот сценарий больше не является проблемой. Можно  создать триггер изначально отключенным, что позволяет протестировать все ошибки компиляции. А позже при редактировании включить его. Вот как его можно создать:

create or replace trigger tr_t
after insert on t
for each row
disable
begin
 insert into t1 (a) values (:new.col_a);
end;
/

Теперь можно проверить его статус:

SQL> select status
2> from user_triggers
3> where trigger_name = 'TR_T'
4> /

STATUS
--------
DISABLED

Даже несмотря на то, что триггер создан отключенным, он должен быть без ошибок. Поэтому, если попытаться создать его с ошибкой (например, используя таблицу "M", которая не существует):

 1 create or replace trigger tr_t
 2 after insert on t
 3 for each row
 4 disable
 5 begin
 6 insert into m (a) values (:new.col_a);
 7* end;
SQL> /

Warning: Trigger created with compilation errors.

SQL> show error

Errors for TRIGGER TR_T:

LINE/COL ERROR

-------- -----------------------------------------------------------------
2/3 PL/SQL: SQL Statement ignored
2/15 PL/SQL: ORA-00942: table or view does not exist

Эта особенность очень полезна в процессе контроля изменений. Другое замечательное применение этой возможности - включение триггеров в определённый момент. Например, с помощью триггеров вы создаёте решение для аудита и audit_table ещё не очищена от старых записей. Триггеры можно создать отключенными, а включить их позже, когда таблица будет готова.