Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:
Фазы событий DML

Синтаксис триггера разделяет пользовательские действия 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

Контекстные переменные NEW и OLD

Сервер делает доступными для триггеров два набора контекстных переменных. Один состоит из всех значений полей текущей строки, какими они были перед последним помещением этой строки в базу данных. Идентификаторы этого набора состоят из слова "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 - вместе с ядром сервера базы данных предоставляют целый арсенал готовых формул, в которые во время выполнения можно подставлять фактические данные для преобразования фрагментов абстрактных данных в информацию, имеющую смысл для человека.

Для простого примера возьмем таблицу 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 использует другой вид выражения- логический предикат - для проверки подходящих строк в таблице. Строки, которые не удовлетворяют этой проверке, не помещаются в выходной набор.

Поделиться:
Популярные книги

Хозяйка усадьбы, или Графиня поневоле

Рамис Кира
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Хозяйка усадьбы, или Графиня поневоле

Бастард Императора. Том 6

Орлов Андрей Юрьевич
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Наследник пепла. Книга II

Дубов Дмитрий
2. Пламя и месть
Фантастика:
фэнтези
5.00
рейтинг книги
Наследник пепла. Книга II

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Нищий барин

Иванов Дмитрий
1. Барин
Фантастика:
попаданцы
5.00
рейтинг книги
Нищий барин

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи