Создание генераторов
Генератор – это хранящаяся в БД программа, выдающая при каждом обращении к ней уникальное число.
Создание генератора:
CREATE GENERATOR <Имя генератора>
Начальное значение задается инструкцией:
SET GENERATOR <Имя генератора> TO <Начальное значение (целое число)>
Пример:
CREATE GENERATOR GenStore
SET GENERATOR GenStore TO 1
Обращение к созданному генератору выполняется с помощью функции
GEN_ID (<Имя генератора>, <Шаг>)
Триггер – это процедура, которая находится на сервере БД и вызывается автоматически при модификации записей БД, т.е. при изменении столбцов или при их удалении и добавлении. В отличие от хранимых процедур, триггеры нельзя вызывать из приложения клиента, а также передавать им параметры и получать от них результаты.
Создание триггера:
CREATE TRIGGER <> FOR <>
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
{UPDATE | INSERT | DELETE}
[POSITION <Число>]
AS <Тело триггера>
Описатели ACTIVE | INACTIVE определяют активность триггера сразу после его создания. По умолчанию действует ACTIVE.
|
|
Описатели BEFORE | AFTER задают момент начала выполнения триггера до или после наступления соответствующего события, связанного с изменением записей.
Описатели UPDATE | INSERT | DELETE определяют, при наступлении какого события вызывается триггер – при редактировании, добавлении или удалении записей.
Для одного события можно создать несколько триггеров, каждый из которых будет автоматически выполнен (если находится в активном состоянии). При наличии нескольких триггеров порядок их вызова (выполнения) определяет число, указанное в операнде POSITION. Триггеры выполняются в порядке возрастания этих чисел.
Удаление триггера:
DROP TRIGGER <Имя триггера>
Изменение триггера:
ALTER TRIGGER
Для доступа к значениям столбца используются инструкции формата:
OLD.<Имя столбца> - обращается к старому (до внесения изменений) значению столбца,
NEW.<Имя столбца> - обращается к новому (после внесения изменений) значению столбца.
Пример:
Создание триггера для занесения в ключевой столбец уникальных значений
CREATE TABLE Store
(S_Code INTEGER NOT NULL,
…
PRIMARY KEY (S_Code));
CREATE GENERATOR GenStore
SET GENERATOR GenStore TO 1
CREATE TRIGGER CodeStore FOR Store
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.S_Code = GEN_ID (GenStore, 1);
END
При добавлении к таблице Store новой записи ключевому столбцу S_Code этой записи автоматически присваивается уникальное значение. Это обеспечивается обращением GEN_ID к генератору GenStore.
Пример:
Реализация каскадного удаления записей с участием триггера
CREATE TABLE Store
(S_Code INTEGER NOT NULL,
…
PRIMARY KEY (S_Code));
CREATE TABLE Cards
(C_Code INTEGER NOT NULL,
C_Code2 INTEGER NOT NULL,
…
PRIMARY KEY (C_Code));
CREATE TRIGGER DeleteStore FOR Store
ACTIVE
AFTER DELETE
AS
BEGIN
DELETE FROM Cards WHERE Store.S_Code = Cards.C_Code2;
|
|
После удаления записи в таблице Store буду автоматически удалены все соответствующие записи в таблице Cards.
Замечание: для таблиц не должны действовать ограничения ссылочной целостности, заданные на физическом уровне.
Пример:
Обновление столбцов связи (ключевых столбцов) связанных таблиц, заключающееся в том, что при изменении значения столбца связи главной таблицы соответственно изменяются значения столбца связи всех связанных записей подчиненной таблицы.
CREATE TRIGGER ChangeStore FOR Store
ACTIVE
BEFORE UPDATE
AS
BEGIN
IF (OLD.S_Code <> NEW.S_Code)
THEN UPDATE Cards
SET C_Code2 = NEW.S_Code
WHERE C_Code2 = OLD.S_Code;
END
При изменении столбца S_Code, используемого для связи главной таблицы Store с подчиненной таблицей Cards, автоматически изменяются значения столбца связи C_Code2 соответствующих записей подчиненной таблицы.
Чтобы столбец главной таблицы можно было редактировать, по нему не должен быть создан ключ.