Триггер – это специальная процедура языка PL/SQL. Обычная процедура начинает выполняться после ее вызова специальной командой, триггер же начинает выполняться, когда происходит определенное событие с таблицей. Событиями, которые вызывают выполнение триггера, являются операции вставки, удаления или обновления, выполняемые командами INSERT, DELETE или UPDATE. Триггеры выполняются либо до, либо после выполнения этих команд. Различают два варианта триггеров: триггеры, которые выполняются при обращении команды к строке таблицы, триггеры, которые выполняются до (или после) выполнения всей команды.
Использование триггера: аудита (отслеживания) модификаций данных; прозрачной журнализации (регистрации) событий; реализации комплексных организационных правил; автоматического вычисления значений столбцов; осуществления сложных процедур защиты; поддержки дублированных таблиц; сбор статистики по обращениям к таблице предотвращения незаконных транзакций;
В триггерах БД Oracle возможно применение логических операторов так называемых предикатов. Они имеют следующие определения INSERTING, UPDATING, DELETING. Это некие внутренние переменные среды Oracle, которые в зависимости от воздействующего на таблицу оператора DML принимают одно из значений TRUE или FALSE. С их помощью можно значительно сэкономить при написании кода, в чем вы в дальнейшем убедитесь и не плодить слишком большое количество объектов БД.
- CREATE TRIGGER TR1 BEFORE UPDATE OF quantity, ware_id ON storages . . .
- BEGIN
- . . .
- IF UPDATING ('quantity') THEN
- . . .
- END IF;
- END;
Ограничение триггера задает булевское (логическое) выражение, которое должно быть истинным (TRUE) для того, чтобы триггер возбудился
Фраза WHEN не может быть включена в определение триггера предложения. Вычисление условия фразы WHEN не влияет на исполнение самого предложения триггера.
Ограничения DML триггеров:
- нельзя выполнять DDL statements (только в автономной транзакции)
- нельзя запускать подпрограммы с операторами контроля транзакций
- не имеет доступа к SERIALLY_REUSABLE пакетов
- размер не может превышать 32К
- нельзя декларировать переменные типа LONG и LONG RAW