Эффективное программирование на 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 ещё не очищена от старых записей. Триггеры можно создать отключенными, а включить их позже, когда таблица будет готова.