Модификация триггеров
Для триггеров, как и для представлений, не существует команды модификации. Старый триггер просто заменяется новым с помощью команды CREATE OR REPLACE TRIGGER.
Триггер можно удалить командой со следующим синтаксисом:
DROP TRIGGER имя_триггера;
Существующие триггеры можно деактивизировать и повторно активизировать, используя команды с таким синтаксисом:
ALTER TRIGGER имя_триггера DISABLE;
ALTER TRIGGER имя_триггера ENABLE;
Особенности использования триггеров
Собираясь использовать триггеры, необходимо учитывать следующее:
триггер, в котором выполняются операторы DML, может вызывать срабатывание других триггеров. В результате количество сработавших триггеров может оказаться довольно большим;
в триггере, который запускается оператором INSERT, имеет смысл обращаться только к новым значениям столбцов. Поскольку INSERT создает строку, старым значением всегда будет NULL;
в триггере, который запускается оператором UPDATE, можно обращаться к старым и новым значениям столбцов. Это касается как BEFORE-, так и AFTER-триггеров;
в триггере, который запускается оператором DELETE, имеет смысл обращаться только к старым значениям столбцов. Поскольку удаленная строка перестает существовать, новым значением всегда будет NULL. Однако значения :new нельзя модифицировать. Если попытаться это сделать, будет выдано сообщение об ошибке ORA-4084;
в теле триггера нельзя использовать операторы ROLLBACK, COMMIT и SAVEPOINT;
при возникновении необрабатываемых исключений производится откат всех изменений, включая те, которые были выполнены запускающим оператором;
если для одного триггерного события определено более одного триггера, то порядок их срабатывания не определен, т.е. нельзя заранее сказать, в какой последовательности они будут срабатывать;
когда триггер пытается прочитать таблицу, а затем записать в нее данные, возбуждается исключение "мутирующей таблицы". Хотя намерение ограничить действия такого типа вполне объяснимо, корпорация Oracle зашла в этом дальше, чем необходимо, запретив операции, при которых таблица просто блокируется, а не изменяется. Один из способов обойти эту проблему заключается в том, чтобы создать вторую таблицу с копиями столбцов, которые триггер должен прочитать из главной таблицы. В этом случае триггер получает необходимые значения из второй таблицы, а затем выполняет запланированные действия с первой таблицей. При реализации данного подхода важно обеспечить синхронизацию таблиц. Для этого все операции INSERT, UPDATE и DELETE над главной таблицей должны отражаться триггером на второй таблице.