Для написания кодов триггеров используются техники PSQL и хранимых процедур. При этом триггеры не могут вызываться из приложений или других процедур. Соответственно, они не могут получать входные и возвращать выходные аргументы, как это возможно в процедурах. В дополнение к PSQL они включают некоторые контекстные расширения языка, применимые только в модулях триггеров.
Все триггеры в Firebird выполняются на уровне строки каждый раз, когда изменяется образ строки. Firebird поддерживает высокий уровень детализации при определении времени, последовательности и условий, при которых будет выполняться конкретный модуль триггера. Множество модулей может быть определено для каждой фазы и события.
Триггеры являются частью работы транзакции, в которой событие DML изменяет состояние строки. Если транзакция успешно подтверждается, все действия триггеров будут "приняты". Если будет выполнен откат транзакции, все действия триггера будут отменены.
Фаза, событие и последовательность
Триггер может выполняться в одной из двух фаз, связанных с запрошенными изменениями состояния данных: до (before) записи или после (after) нее. Он может применяться к одному из трех событий DML: добавление, изменение или удаление. Начиная с Firebird 1.5 возможно объединение действий триггера для двух или трех событий DML в одном модуле триггера до или после.
Фаза и событие
В табл. 31.1 представлены восемь типов модулей триггеров.
Таблица 31.1. Комбинации фаза/событие для модулей триггеров
Вид триггера | Описание | Версия |
BEFORE INSERT | Вызывается до создания новой строки. Позволяет изменять входные значения | Все |
AFTER INSERT | Вызывается после создания новой строки. Не позволяет изменять входные значения. Обычно используется для модификации других таблиц | Все |
BEFORE UPDATE | Вызывается до создания новой версии записи. Позволяет изменять входные значения | Все |
AFTER UPDATE | Вызывается после создания новой версии записи. Не позволяет изменять входные значения. Обычно используется для изменения других таблиц | Все |
BEFORE DELETE | Вызывается до удаления существующей строки. Не принимает изменений никаких столбцов в строке | Все |
AFTER DELETE | Вызывается после удаления строки. Не принимает изменений никаких столбцов в строке. Обычно используется для модификации других таблиц | Все |
BEFORE <событие> OR <событие> [OR <событие>] | Вызывается до выполнения изменения любого требуемого состояния данных. Действия для события DML должны быть закодированы условно. Действие "Удаление" не может изменять никакие столбцы в строке | 1.5+ |
AFTER <событиё> OR <событие> [OR <событие>] | Вызывается после выполнения изменения любого требуемого состояния данных. Действия для события DML должны быть закодированы условно. Действия не могут изменять никакие столбцы в строке. Обычно используется для модификации других таблиц | 1.5+ |
Последовательность
Для любой комбинации фаза/событие Firebird позволяет использовать множество триггеров. Вероятно, существует какое-то практическое ограничение, однако можно с уверенностью сказать, что вы можете создавать столько триггеров, сколько вам нужно с использованием целых чисел от 0 до 32 767. Последовательный номер по умолчанию (POSITION) ноль. Хорошей практикой является задание для триггера порядка выполнения, однако явное указание последовательности не является обязательным. Если присутствуют последовательные номера, триггеры будут выполняться в возрастающем порядке. Числа не должны быть уникальными, последовательность может иметь разрывы.
Набор триггеров для фазы/события со значением по умолчанию POSITION 0 будет выполняться в алфавитном порядке их имен. То же самое можно ожидать, если вы имеете группу триггеров, имеющих один и тот же не нулевой последовательный номер.