Читаем Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ полностью

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

CREATE TRIGGER BU_ACC0UNT5 FOR ACCOUNT

ACTIVE BEFORE UPDATE POSITION 5 AS ...

CREATE TRIGGER BU_ACCOUNTO FOR ACCOUNT

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.

<p>Состояние</p>

Триггер может быть активным (active) или неактивным (inactive). Запускаются только активные триггеры. См. замечания к ALTER TRIGGER по поводу подробностей деактивации триггера.

<p>Создание триггеров</p>

Триггер определяется с помощью оператора CREATE TRIGGER, который состоит из заголовка и тела. Заголовок триггера отличается от заголовка хранимой процедуры, он содержит:

* имя триггера, которое должно быть уникальным в базе данных;

* имя таблицы, идентифицирующее таблицу, с которой ассоциируется триггер;

* атрибуты, которые определяют состояние, фазу, событие DML и, необязательно, последовательность.

Тело триггера, как и тело хранимой процедуры, содержит:

* необязательный список локальных переменных и их типов данных;

* блок операторов на языке процедур и триггеров Firebird, заключенный в операторные скобки BEGIN и END. Эти операторы выполняются, когда запускается триггер. Сам блок может включать другие блоки, так что может существовать много уровней вложенности.

<p>Синтаксис</p>

Для всех версий 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 <тело-триггера> ^

<p>Элементы заголовка</p>

Все, предшествующее предложению AS, является заголовком триггера. Заголовок должен задавать уникальное имя триггера и имя существующей подтвержденной таблицы или просмотра, кому принадлежит триггер.

Именование триггеров

Синтаксис требует, чтобы имя триггера было уникальным среди всех имен триггеров в базе данных. Хорошей практикой является применять некоторые соглашения для именования триггеров, которые имеют смысл для вас и очевидны для всех других, кто будет работать с вашей базой данных. Автор использует "формулу" для идентификации фазы и события (BI | AI | BU | AU | BD | AD | BA | AA - два последних представляют "до всех", Before All и "после всех", After All), имя таблицы и номер в последовательности, если нужно[119]. Например, триггер до добавления для таблицы CUSTOMER может быть назван BI_CUSTOMERI.

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 число, определяет момент запуска триггера по отношению к другим триггерным модулям для той же фазы и события.

<p>Тело триггера</p>

Во всех кодах модулей Firebird тело состоит из необязательного объявления списка локальных переменных, за которым следует блок операторов. Программирование тела триггера в точности такое же, как и программирование тела процедуры (см. главу 30). Интерес для нас в этой главе представляют некоторые специальные расширения PSQL, осуществляющие поддержку контекста триггера, и некоторые особые роли триггеров по реализации и поддержке бизнес-правил.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных