Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Синтаксис триггера разделяет пользовательские действия DML на две фазы: первая
фаза появляется до (BEFORE) события, а вторая после (AFTER) события.
* Фаза BEFORE дает возможность управлять преобразованием значений, которые являются входными в операторе DML, и определять значения по умолчанию гораздо более гибкими способами, чем это позволено в стандартном SQL-ограничении DEFAULT. Фаза BEFORE завершается перед тем, как начинают проверяться любые ограничения столбца, таблицы или ограничения целостности.
*
Табл. 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 проявляет свою реальную мощь в возможности использовать выражения при поиске хранимых данных и преобразовании абстрактных данных в выходные, которые имеют
ГЛАВА 21. Выражения и предикаты.
В алгебре выражение типа а + b = с может иметь решение "истина" или "ложь" при подстановке значений в a, b и с. Альтернативный вариант - если задано два значения из a, b, c, мы можем вычислить отсутствующее значение. Это и является выражением SQL - формула подстановки.
Выражения SQL предоставляют формальные компактные методы для вычисления, преобразования и сравнения значений. В этой главе мы подробно рассмотрим выражения в SQL Firebird.
В конце этой главы приведено много информации по внутренним функциям SQL, доступным в Firebird для создания выражений, а также по большинству общих внешних функций.
Выражения
Хранение данных в простом, наиболее абстрактном виде - вот что делают базы данных. Язык поиска - в случае Firebird это обычно SQL - вместе с ядром сервера базы данных предоставляют целый арсенал готовых формул, в которые во время выполнения можно подставлять фактические данные для преобразования фрагментов абстрактных данных в информацию, имеющую смысл для человека.
Для простого примера возьмем таблицу MEMBERSHIP, которая имеет столбцы FIRST_NAME, LAST_NAME и DATE_OF_BIRTH. Для получения списка, содержащего полное имя и дату рождения, мы можем использовать оператор, содержащий выражения для преобразования хранимых данных:
SELECT
FIRST_NAME ||' '|| LAST_NAME AS FULL_NAME,
EXTRACT (MONTH FROM DATE_OF_BIRTH) ||'/'|| EXTRACT (DAY FROM DATE_0F_BIRTH)
AS BIRTHDAY
FROM MEMBERSHIP
WHERE FIRST_NAME IS NOT NULL AND LAST_NAME IS NOT NULL
ORDER BY 2;
Во время отправления запроса на сервер мы не знаем, какие значения хранятся в базе данных. Однако мы знаем, на что они должны быть похожи (семантика их значений и типы данных), для нас этого достаточно, чтобы сконструировать выражения для поиска списка в том виде, который будет для нас иметь смысл.
В этом одном операторе мы используем три вида выражений SQL.
* Для первого поля FULL NAME используется оператор конкатенации (в SQL два символа вертикальной черты 11) для создания выражения, которое объединяет два поля базы данных, разделенные пробелами в одно.
* Для второго поля BIRTHDAY используется функция для выделения сначала месяца, а затем дня месяца из поля даты. В том же выражении опять используется оператор конкатенации для объединения вместе выделенных чисел в качестве даты рождения. День отделяется от месяца наклонной чертой.
* В качестве условия поиска предложение WHERE использует другой вид выражения- логический предикат - для проверки подходящих строк в таблице. Строки, которые не удовлетворяют этой проверке, не помещаются в выходной набор.