Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
17.04.2018
Размер:
103.42 Кб
Скачать

7.5. Триггеры

Триггер можно рассматривать как процедуру, которая автоматически выполняется при возникновении некоторого события, указанного в определении триггера, — триггерного события (triggering event).

Написанные триггеры срабатывают в одной из следующих ситуаций:

  • применение оператора DML к определенному объекту схемы;

  • выполнение оператора DDL внутри схемы или базы данных;

  • вход пользователя в систему или выход его из системы, ошибка сервера, запуск базы данных или останов экземпляра.

Между триггерами и процедурами PL/SQL есть три различия:

  • триггеры нельзя вызывать из кода программы. Oracle вызывает их автоматически в ответ на определенное событие;

  • триггеры не имеют списка параметров;

  • спецификация триггера немного отличается от спецификации процедуры.

Сходство между триггерами и процедурами состоит в следующем:

  • тело триггера выглядит точно так же, как и тело процедуры — и то, и другое представляют собой базовые блоки PL/SQL;

  • триггер не возвращает никаких значений;

  • триггеры можно использовать для выполнения разнообразных задач;

  • триггеры автоматически генерируют производные значения столбцов. Например, при обработке каждого нового заказа комиссионные торгового агента могут рассчитываться и вводиться в соответствующую таблицу автоматически;

  • триггеры помогают предотвращать неверные транзакции. Например, триггер может воспрепятствовать увеличению зарплаты служащего на большую величину, чем предусмотрено бюджетом. Заметьте, что это нельзя сделать с помощью контрольных ограничений, поскольку контрольное ограничение имеет дело только со значениями текущей строки, а следовательно, не может определять общий размер бюджета;

  • триггеры можно использовать для реализации сложных процедур авторизации. Например, значение зарплаты могут изменять только руководители и только для людей, находящихся в их подчинении;

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

  • триггеры могут обеспечивать протоколирование событий, например, отслеживать, сколько раз отдельный продавец обращался к таблице с инвентарной ведомостью;

  • триггеры могут обеспечивать сложный аудит. Например, с помощью триггера легко выяснить, какое среднее число обращений к базе данных требуется данному продавцу для обработки одного заказа;

  • триггеры могут собирать статистику доступа к таблицам. Например, триггер позволяет зафиксировать, сколько раз в течение дня выполнялись запросы на товар "Small Widget" к таблице с каталогом товаров.

Из перечисленных особенностей следует, что триггеры представляют собой весьма мощные инструменты. Однако их следует использовать аккуратно, поскольку триггер может срабатывать при каждом обращении к таблице, тем самым увеличивая нагрузку на сервер базы данных. Разумное практическое правило состоит в том, чтобы использовать триггер только для действий, которые нельзя выполнить другими средствами. Например, если есть возможность создать одно или несколько ограничений, выполняющих работу некоторого триггера, следует использовать эти ограничения. Если итоговые величины допустимо вычислять в нерабочее время, систему лучше спроектировать именно так, а не использовать триггеры, срабатывающие при каждой транзакции. Предположим, например, что банк принимает решение о доставке дополнительной наличности из центрального хранилища в зависимости от того, сколько пятисотрублевых банкнот было выдано за текущий день. Эту величину можно определять по окончании рабочего дня. Если же для обновления счетчика пятисотрублевых банкнот будет использоваться триггер, то его постоянное срабатывание может существенно замедлить скорость выполнения транзакций в рабочие часы.

Триггеры, определенные для таблиц, называются табличными триггерами (table triggers). Синтаксис создания табличного триггера имеет следующей вид:

CREATE OR REPLACE TRIGGER имя_триггера момент_срабатывания

триггерное_событие

ON имя_таблицы

[WHEN триггерное_ограничение]

[FOR EACH ROW]

[DECLARE

объявления]

BEGIN

операторы

[EXCEPTION

WHEN имя_исключения

THEN ...]

END имя_триггера ;

Соседние файлы в папке Lab5