Триггеры ссылочной целостности являются модулями компилированного кода, создаваемыми ядром сервера, когда вы объявляете ограничение ссылочной целостности для ваших таблиц. Включив предложения действия ON UPDATE и ON DELETE В объявление ограничения FOREIGN KEY, вы можете задать одно из группы действий, которое будет выполняться при наступлении соответствующего события DML. Подробности см. в главе 17.
Пользовательские триггеры
В пользовательских триггерах (тех, которые вы пишете сами, используя язык PSQL) у вас есть возможность точно задать, что происходит, когда сервер получает запрос на добавление, изменение или удаление строк таблицы. Пользовательские триггеры
могут применяться не только для изменения и удаления, но также и для добавления.
Триггеры могут включать обработку исключений, обратные связи и (для Firebird 1.5) пользовательские планы запросов.
Синтаксис триггера разделяет пользовательские действия DML на две фазы: первая
фаза появляется до (BEFORE) события, а вторая после (AFTER) события.
* Фаза BEFORE дает возможность управлять преобразованием значений, которые являются входными в операторе DML, и определять значения по умолчанию гораздо более гибкими способами, чем это позволено в стандартном SQL-ограничении DEFAULT. Фаза BEFORE завершается перед тем, как начинают проверяться любые ограничения столбца, таблицы или ограничения целостности.
* В фазе AFTER ответные действия могут быть выполнены над другими таблицами. Обычно такие действия включают добавления, изменения или удаления данных других таблиц с использованием переменных NEW и OLD для обеспечения контекста текущей строки и операции. Фаза AFTER начинается после применения всех ограничений собственной таблицы. Триггеры AFTER не могут изменять значения в текущей строке собственной таблицы.
Табл. 20.1 описывает шесть фаз/событий пользовательских триггеров.
Таблица 20.1. Шесть фаз/событий пользовательских триггеров
Добавление | Изменение | Удаление |
BEFORE INSERT | BEFORE UPDATE | BEFORE DELETE |
AFTER INSERT | AFTER UPDATE | AFTER DELETE |
Сервер делает доступными для триггеров два набора контекстных переменных. Один состоит из всех значений полей текущей строки, какими они были перед последним помещением этой строки в базу данных. Идентификаторы этого набора состоят из слова "OLD.", за которым следует идентификатор столбца. Аналогичным образом все новые значения имеют префикс "NEW." перед каждым идентификатором столбца. Разумеется, "OLD." не имеет смысла в триггерах добавления, a "NEW." бессмысленно использовать в триггерах удаления.
В Firebird 1.5 и выше вы можете писать триггеры с условной логикой для всех событий (добавление, изменение и удаление) для одной из фаз- BEFORE или AFTER - в одном модуле триггера. Это долгожданное улучшение, которое уменьшает кодирование триггеров на две трети.
Другой полезной возможностью является использование нескольких триггеров для каждой комбинации фаза/событие. Синтаксис CREATE TRIGGER включает ключевое слово POSITION, принимающее целый аргумент, который может быть использован для установки начинающегося с нуля порядка, в котором будут выполняться триггеры для одной фазы.
Подробные инструкции, синтаксис и языковые расширения для создания триггеров см. в главе 31.
DML проявляет свою реальную мощь в возможности использовать выражения при поиске хранимых данных и преобразовании абстрактных данных в выходные, которые имеют смысл для конечного пользователя как информация. В следующей главе рассматривается логика использования выражений SQL вместе с внутренними и внешними функциями, которые вы можете использовать для создания простых или сложных алгоритмов для выполнения необходимых вам преобразований.
ГЛАВА 21. Выражения и предикаты.
В алгебре выражение типа а + b = с может иметь решение "истина" или "ложь" при подстановке значений в a, b и с. Альтернативный вариант - если задано два значения из a, b, c, мы можем вычислить отсутствующее значение. Это и является выражением SQL - формула подстановки.
Выражения SQL предоставляют формальные компактные методы для вычисления, преобразования и сравнения значений. В этой главе мы подробно рассмотрим выражения в SQL Firebird.
В конце этой главы приведено много информации по внутренним функциям SQL, доступным в Firebird для создания выражений, а также по большинству общих внешних функций.
Выражения
Хранение данных в простом, наиболее абстрактном виде - вот что делают базы данных. Язык поиска - в случае Firebird это обычно SQL - вместе с ядром сервера базы данных предоставляют целый арсенал готовых формул, в которые во время выполнения можно подставлять фактические данные для преобразования фрагментов абстрактных данных в информацию, имеющую смысл для человека.