Чтение онлайн

на главную - закладки

Жанры

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. Выполняется

триггер AU_ACCOUNT5.

Состояние

Триггер может быть активным (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 - два

последних представляют "до всех", Before All и "после всех", After All), имя таблицы и номер в последовательности, если нужно [119] . Например, триггер до добавления для таблицы CUSTOMER может быть назван BI_CUSTOMERI.

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.

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2