- •Введение.
- •Лекция 1. Введение в клиент-серверные субд.
- •Interbase sql Server. Общие сведения.
- •Платформы
- •Типы приложений
- •Файлы базы данных InterBase
- •Лекция 3. Триггеры и хранимые процедуры
- •Хранимые процедуры (Stored Procedures)
- •Терминаторы
- •Заголовок
- •Тело процедуры
- •Блок кода процедуры
- •Оператор присваивания
- •Условный оператор if… then … else
- •Оператор select
- •Цикл for select и suspend
- •Цикл while … do
- •Операторы insert, update, delete
- •Оператор execute procedure
- •Исключения
- •События и оператор post_event
- •Изменения и удаления хранимых процедур
- •Примеры создания и вызова хранимых процедур
- •Генераторы
- •Увеличение шага генератора
- •Триггеры
- •Переменные new и old
- •Реализация автоинкрементных ключевых полей
- •Лекция 4. Транзакции. Механизм транзакций
- •Атомарность (Atomicity)
- •Согласованность (Consistency)
- •Изолированность (Isolation)
- •Устойчивость (Durability)
- •Неявный и явный старт транзакций
- •Как транзакция работает
- •Уровни изолированности транзакций
- •Параметры транзакций
Триггеры
Триггерами называются подпрограммы, которые всегда выполняются автоматически на стороне сервера, в ответ на изменение данных в таблицах БД.
Триггеры используют тот же встроенный язык программирования, что и хранимые процедуры, но отличаются от них прежде всего тем, что триггеры никогда не вызываются напрямую, ни из клиентских программ, ни с помощью 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. Таким образом, можно создать несколько разных триггеров, которые будут запускаться в ответ на одно и то же событие, и каждый будет срабатывать в свою очередь.
AS
Как и в хранимых процедурах, командой AS начинается тело триггера. Перед операторской скобкой BEGIN имеется возможность объявить одну или несколько локальных переменных, если они нужны, оператором
[DECLARE [VARIABLE] <переменная тип_данных>;]