Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
ACTIVE BEFORE UPDATE POSITION 0 AS ...
CREATE TRIGGER AU_ACCOUNT5 FOR ACCOUNT
ACTIVE AFTER UPDATE POSITION 5 AS ...
CREATE TRIGGER AU_ACCOUNT3 FOR ACCOUNT
ACTIVE AFTER UPDATE POSITION 3 AS ...
Кто-то изменяет некоторые строки в таблице ACCOUNT:
UPDATE ACCOUNT SET С ='CANCELED' WHERE C2 = 5;
Вот последовательность событий для каждой изменяемой строки:
1. Выполняется триггер BU_ACCOUNTO.
2. Выполняется триггер BU_ACCOUNTS.
3. Новая версия записи записывается на диск.
4. Выполняется триггер AU_ACCOUNT3.
5. Выполняется
Состояние
Триггер может быть активным (active) или неактивным (inactive). Запускаются только активные триггеры. См. замечания к ALTER TRIGGER по поводу подробностей деактивации триггера.
Создание триггеров
Триггер определяется с помощью оператора CREATE TRIGGER, который состоит из заголовка и тела. Заголовок триггера отличается от заголовка хранимой процедуры, он содержит:
* имя триггера, которое должно быть уникальным в базе данных;
* имя таблицы, идентифицирующее таблицу, с которой ассоциируется триггер;
* атрибуты, которые определяют состояние, фазу, событие DML и, необязательно, последовательность.
Тело триггера, как и тело хранимой процедуры, содержит:
* необязательный список локальных переменных и их типов данных;
* блок операторов на языке процедур и триггеров Firebird, заключенный в операторные скобки BEGIN и END. Эти операторы выполняются, когда запускается триггер. Сам блок может включать другие блоки, так что может существовать много уровней вложенности.
Синтаксис
Для всех версий Firebird синтаксис CREATE TRIGGER одинаков:
CREATE TRIGGER имя FOR {таблица | просмотр}
[ACTIVE | INACTIVE]
{BEFORE | AFTER} {DELETE | INSERT | UPDATE}
[POSITION число]
AS <тело-триггера> ^
<тело-триггера> = [<список-объявления-переменных>] <блок>
<список-объявления-переменных> = DECLARE VARIABLE переменная тип-данных;
[DECLARE [VARIABLE] переменная тип-данных; ...]
<блок> =
BEGIN
<составной-оператор> [<составной-оператор> ...]
END
<составной-оператор> = <блок> | оператор;
В версии 1.5 возможно слияние всех событий в один триггер фазы:
CREATE TRIGGER имя FOR {таблица | просмотр}
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
{DELETE OR {[INSERT [OR UPDATE]} | {INSERT OR [. . ]} | {UPDATE OR [..]}}
[POSITION число]
AS <тело-триггера> ^
Элементы заголовка
Все, предшествующее предложению AS, является заголовком триггера. Заголовок должен задавать уникальное имя триггера и имя существующей подтвержденной таблицы или просмотра, кому принадлежит триггер.
Синтаксис требует, чтобы имя триггера было уникальным среди всех имен триггеров в базе данных. Хорошей практикой является применять некоторые соглашения для именования триггеров, которые имеют смысл для вас и очевидны для всех других, кто будет работать с вашей базой данных. Автор использует "формулу" для идентификации фазы и события (BI | AI | BU | AU | BD | AD | BA | AA - два
119
Хотя триггеры "привязаны" к таблицам, некоторые инструменты выводят общий список триггеров для просмотра, сортируя его по именам триггеров. В этом случае следует выбрать иной способ формирования имени триггера (из имени таблицы, его типа и других характеристик), чтобы представление триггеров было отсортировано в нужном вам порядке.
– Прим.
CREATE TRIGGER BI CUSTOMERl FOR CUSTOMER...
Перечислим остальные атрибуты заголовка триггера.
* Состояние триггера, ACTIVE или INACTIVE, определяющее, будет ли триггер запускаться после его создания. Значение по умолчанию ACTIVE. Деактивация триггера полезна при разработке и отладке.
* Индикатор фазы, BEFORE или AFTER, определяющий момент, когда триггер будет выполняться при событии DML.
* Индикатор события DML определяет тип операции SQL, при которой будет выполняться триггер: INSERT, UPDATE или DELETE.
* В Firebird 1.0.x может быть указан индикатор ровно одного события. Начиная с версии 1.5, необязательное расширение <событие> OR <событие> ... позволяет задавать два или три события в одном модуле. Например, ... BEFORE INSERT OR UPDATE OR DELETE ... позволяет вам задать действия для всех трех событий. Логические контекстные переменные INSERTING, UPDATING или DELETING поддерживают логику переходов.
* Необязательный индикатор последовательности, POSITION число, определяет момент запуска триггера по отношению к другим триггерным модулям для той же фазы и события.
Тело триггера
Во всех кодах модулей Firebird тело состоит из необязательного объявления списка локальных переменных, за которым следует блок операторов. Программирование тела триггера в точности такое же, как и программирование тела процедуры (см. главу 30). Интерес для нас в этой главе представляют некоторые специальные расширения PSQL, осуществляющие поддержку контекста триггера, и некоторые особые роли триггеров по реализации и поддержке бизнес-правил.
Триггеры могут вызывать хранимые процедуры. Правила вызова для триггеров в точности такие же, что и для хранимых процедур. Техники обработки исключений обсуждаются в главе 32.
Триггеры могут использовать курсоры, выполнять операции с другими таблицами и отправлять события. Они могут вызывать и обрабатывать исключения, включая те, которые возникли во вложенных процедурах.
Триггеры никогда не вызываются процедурами, другими триггерами или приложениями. Они совсем не поддерживают входные и выходные аргументы.
Особенности PSQL для триггеров
Два особых элемента PSQL доступны триггерам: логические контекстные переменные событий INSERTING, UPDATING и DELETING и контекстные переменные NEW и OLD.