Шаг 110 - PL/SQL - Триггеры БД, теория

Думаю, самое время заняться еще одним типом именованных блоков PL/SQL, а именно триггеры таблиц БД. Сам по себе триггер БД, является именованным блоком PL/SQL и после компиляции хранится, в соответствующих словарях данных вашей БД. Но он имеет ряд особенностей. Процедуры или функции, которые мы с вами уже разбирали могут вызывать или быть вызваны другими процедурами, при этом им могут быть переданы параметры. Триггер - не может быть вызван из другой процедуры БД и не принимает никаких параметров при вызове. Само название говорит о том, что этот блок PL/SQL - срабатывает при определенном событии, а именно при запуске операций DML - INSERT, UPDATE, DELETE. Существуют так же так называемые системные триггеры, которые срабатывают на события самой БД. Но о них чуть позже. В основном триггеры используются для:

  1. Реализации сложных ограничений целостности данных, которые невозможно осуществить через описательные ограничения, устанавливаемые при создании таблиц.
  2. Организации всевозможных видов аудита. Например, слежения за изменениями в какой-либо важной таблице БД.
  3. Автоматического оповещения других модулей о том, что делать в случае изменения информации содержащейся в таблице БД.
  4. Для реализации так называемых "бизнес правил".
  5. Для организации каскадных воздействий на таблицы БД.

В принципе по ходу работы можете придумать еще что-нибудь! Вообще триггеры очень удобная и полезная вещь в БД. Так же триггеры имеют определенные правила активации (firing), а именно:

  1. До момента сработки одного из операторов DML - INSERT, UPDATE, DELETE.
  2. После момента сработки одного из операторов DML - INSERT, UPDATE, DELETE.

Синтаксис команды для создания триггера, следующий:

--- CREATE [OR REPLACE] TRIGGER имя_триггера ---------------------
--- BEFORE | AFTER активизирующее_событие ON ссылка_на_таблицу ---
--- FOR EACH ROW [WHEN условие_срабатывания] ---------------------
--- тело_триггера ------------------------------------------------

Где:

Для полноты картины определимся с таким фактом, что триггеры имеют собственное пространство имен (namespace). Что это означает, само понятие namespace - применимо вообще во многих языках программирования. В пределах одного пространства имен не может быть двух функций или процедур с одинаковым именем! Так вот, так как пространство имен у триггеров свое, то может иметь место ситуация, когда какой-либо триггер имеет тоже имя, что и процедура или функция в пределах одной схемы (не путать с пространством имен это разные вещи!). Но двух триггеров с одинаковым именем не бывает! Так же триггер, может иметь имя совпадающее с именем таблицы, для которой он создан. Но лучше этого не делать, а дать триггеру имя указывающее на то, что он производит! Вообще, по моему мнению, такое понятие как имя для триггера по большому счету архаично! Ведь триггер нельзя "позвать" из процедуры или функции - это запрещено! Так нафига ему имя! Можно было сделать что-то вроде универсальной цифровой маркировки. Хотя имя дает триггеру осмысленность, что улучшает чтение кода БД! Теперь давайте посмотрим на типы триггеров и моменты срабатывания и что все это значит. Итак:

КатегорииЗначениеКомментарии
ОператорINSERT, UPDATE, DELETEОпределяет какой оператор DML вызывает активацию (firing) триггера.
Момент времениBEFORE, AFTERОпределяет момент активации триггера: до или после выполнения оператора.
УровеньСтрока или операторЕсли триггер является строковым он активируется один раз для каждой из строк, на которую воздействует оператор вызывающий срабатывания триггера (опция FOR EACH ROW). Если триггер является операторным то он активируется один раз до или после оператора.

Если посмотреть внимательнее, то значения заданные для оператора, момента времени и уровня, определяют тип триггера. Всего получается 12 возможных типов - 3 оператора, 2 момента времени, 2 уровня. Количество триггеров, для отдельной таблицы в принципе не ограничивается в версии Oracle 8i и выше, но делать их слишком много нет смысла. Так же триггер может срабатывать от нескольких операторов DML, если это необходимо. Вот собственно, основная теоретическая часть по триггерам БД. Далее попробуем это на практике.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 14.04.2004