Триггер – это специальная процедура языка PL/SQL. Обычная процедура начинает выполняться после ее вызова специальной командой, триггер же начинает выполняться, когда происходит определенное событие с таблицей. Событиями, которые вызывают выполнение триггера, являются операции вставки, удаления или обновления, выполняемые командами INSERT, DELETE или UPDATE. Триггеры выполняются либо до, либо после выполнения этих команд. Различают два варианта триггеров: триггеры, которые выполняются при обращении команды к строке таблицы, триггеры, которые выполняются до (или после) выполнения всей команды.
Использование триггера: аудита (отслеживания) модификаций данных; прозрачной журнализации (регистрации) событий; реализации комплексных организационных правил; автоматического вычисления значений столбцов; осуществления сложных процедур защиты; поддержки дублированных таблиц; сбор статистики по обращениям к таблице предотвращения незаконных транзакций;
Просмотр информации про триггер: Вывод информации о триггерах.
Следующие обзоры(представления) словаря данных раскрывают информацию о триггерах: USER_TRIGGERS, ALL_TRIGGERS, DBA_TRIGGERS.
Просмотр типа триггера, к какой таблице относиться.
- SELECT type, triggering_statement, table_name
- FROM user_triggers
- WHERE name = 'имя триггера';
Просмотр тела триггера.
- SELECT trigger_body
- FROM user_triggers
- WHERE trigger_name = 'имя триггера';
Именование триггеров. Имена триггеров должны быть уникальными среди всех триггеров в той же схеме. Имена триггеров не обязаны быть уникальными по отношению к другим объектам схемы (таких как таблицы, обзоры, процедуры); например, таблица и триггер могут иметь одно и то же имя (хотя, во избежание путаницы, это не рекомендуется).
Стоит обратить внимание:
- Для таблиц можно создать только BEFORE или AFTER триггеры. (INSTEAD OF триггеры допустимы только для представлений, если необходимо выполнять модификации представлений)
- В определении триггера можно использовать ключевое слово OR для определения события. Для события UPDATE можно использовать опцию OF для определения списка столбцов таблица, при обновлении которых будет выполняться триггер.
- Если указан параметр FOR EACH ROW, то триггер вызывается при каждом обращении к строке, в противном случае – при выполнении команды.
- Если определен триггер для строки, то можно задать условия в опции WHEN, ограничивающие вызовы триггера. В условии не допустимы подзапросы. Если опция WHEN не указана, то триггер вызывается при каждом обращении к строке таблицы.
- <тело_триггера> это PL/SQL блок, а не последовательность SQL команд. В Oracle есть несколько ограничений на то, что можно разместить в <тело_триггера>. Эти ограничения связаны с ситуациями подобными: один триггер выполняет действие, которое приводит к выполнению другого триггера, выполнение которого, в свою очередь, приводит к вызову третьего триггера и т.о. организуется бесконечный цикл вызовов триггеров.
Ограничения на <тело_триггера>:
- Нельзя использовать команды модификации самой таблицы, т.к. эти изменения приведут к вызову данного триггера.
- Нельзя использовать команды модификации таблиц, связанных с данной, посредством внешнего ключа.
Использование специальных имен NEW и OLD позволяет ссылаться на новые и старые строки (кортежи) таблицы. Замечание: в теле триггера перед NEW и OLD размещается символ ":", а в WHEN условии – нет!
Команда CREATE TRIGGER завершается точкой и командой run;, как обычно в PL/SQL. Команда run; завершает создание триггера, но не вызывает его выполнение. Только событие, связанное с триггером, а именно вставка строки в таблицу Т4, вызовет его выполнение.
Порядок активации триггеров в большинстве случаев таков:
- Выполняется операторный триггер BEFORE (при его наличии)
- Для каждой строки, на которую воздействует оператор:
- Выполняется строковый триггер BEFORE (при его наличии).
- Выполняется собственно оператор.
- Выполняется строковый триггер AFTER (при его наличии).
- Выполняется операторный триггер AFTER (при его наличии).