Триггеры
Триггерами называются подпрограммы, которые всегда выполняются автоматически на стороне сервера, в ответ на изменение данных в таблицах БД.
Триггеры используют тот же встроенный язык программирования, что и хранимые процедуры, но отличаются от них прежде всего тем, что триггеры никогда не вызываются напрямую, ни из клиентских программ, ни с помощью IBConsole, ни из хранимых процедур или других триггеров. Зато в теле триггера можно обратиться к хранимой процедуре. Триггеры начинают действовать в ответ на какое то событие, например, удалили запись в таблице или изменили значение в каком то поле. Кроме того, в триггерах добавлена возможность обращаться к старым и новым значениям столбцов с помощью встроенных переменных OLD и NEW.
Триггер может выполняться в двух фазах изменения данных: до(Before) какого то события, или после(After) него. Синтаксис определения триггера следующий:
CREATE TRIGGER <имя_триггера> FOR <имя_таблицы>[ACTIVE | INACTIVE]{BEFORE | AFTER} {DELETE | INSERT \ UPDATE}[POSITION <число>]AS[DECLARE [VARIABLE] <переменная тип_данных>;]BEGIN <операторы_триггера>ENDКак мы видим, создание триггера несколько отличается от создания хранимой процедуры, несмотря на то, что они используют один и тот же алгоритмический язык. Например, у триггера отсутствуют входные и выходные параметры. Разберем его синтаксис по частям.
[ACTIVE | INACTIVE]
Необязательный параметр определяет, будет триггер запускаться в ответ на событие, или не будет. По умолчанию устанавливается ACTIVE, то есть триггер будет запускаться. Отключение триггера иногда может быть полезным при отладке приложения.
{BEFORE | AFTER} {DELETE | INSERT | UPDATE}
Два обязательных параметра, комбинация которых может запрограммировать триггер на шесть различных событий:
Таблица 20.1. . Варианты возможных событий триггера | |
Комбинация параметров | Описание |
BEFORE INSERT | Триггер вызывается до создания новой строки. Такой триггер обычно используют для поддержки автоинкрементных полей. Также внутри триггера можно изменить входные значения, или сгенерировать значение для какого либо поля. |
AFTER INSERT | Триггер вызывается после создания новой записи, и не позволяет менять значения полей. Обычно такой триггер используют для модификации других, связанных таблиц. |
BEFORE DELETE | Триггер вызывается перед удалением записи. Чаще всего его используют для реализации бизнес-правил. |
AFTER DELETE | Триггер вызывается после удаления записи. Его также используют для реализации бизнес-правил, либо модификации других таблиц. |
BEFORE UPDATE | Триггер вызывается перед принятием новых значений в поля записи. Позволяет менять входные значения. |
AFTER UPDATE | Триггер вызывается после принятия изменений в запись. Не позволяет менять значения. Обычно используется для модификации связанных таблиц. |
Эти шесть вариантов реагирования на события делают триггер самым мощным средством для реализации бизнес-правил, проверки целостности и непротиворечивости данных.
[POSITION <число>]
Необязательный параметр, который определяет очередность запуска, если для той же таблицы и для того же события имеется другой триггер. По умолчанию устанавливается 0. Таким образом, можно создать несколько разных триггеров, которые будут запускаться в ответ на одно и то же событие, и каждый будет срабатывать в свою очередь.