
- •2.Работа с утилитой bde Administrator
- •2.1. Назначение bde Administrator
- •2.2. Создание псевдонима бд
- •3. Работа с утилитой Windows Interactive sql (wisql)
- •3.1. Создание новой бд
- •3.2. Установка соединения
- •3.3. Создание таблиц бд
- •3.4. Просмотр структуры компонентов базы данных
- •4.2. Создание триггера
- •4.3. Значения old и new
- •4.4. Обеспечение каскадных воздействий
- •5. Работа с хранимыми процедурами
- •5.1. Понятие хранимой процедуры
- •5.2. Создание хранимой процедуры
- •6. Использование генераторов
- •7.3. Сбор статистики о бд
- •7.3.1. Статистические данные непосредственно о бд
- •7.3.2. Анализ бд
- •7.4. Регистрация пользователей
- •7.5. Поддержка базы данных
- •Validate record fragments - проверять фрагменты записей
- •8.Задание к лабораторной работе
- •Работа с утилитой Windows Interactive sql (wisql)
- •9. Работа с утилитой InterBase Server Manager.
- •Приложение 1
- •Формат sql-операторов (субд InterBase)
- •База данных
- •Создание базы данных
- •Определение типа данных
- •Домены Создание домена
- •Ограничения, накладываемые на значения полей, ассоциированных с доменом
- •Определение ограничения внешнего ключа и ссылочной целостности с родительской таблицей
- •Удаление столбца (столбцов) из таблицы бд
- •Обращение к хранимой процедуре (утилита wisql)
- •Оператор выбора select
- •Принудительная выдача выходных параметров (только хранимые процедуры)
- •Отъем привилегий
- •Приложение 2 Пример Script-файла
4.2. Создание триггера
Триггер создается оператором
CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы
[ACTIVE I INACTIVE]
{BEFORE I AFTER}
{DELETE I INSERT ! UPDATE}
{POSITION номер}
AS <тело триггера>
• ACTIVE | INACTIVE - указывает, активен триггер или нет. Можно определить триггер "про запас", установив для него INACTIVE. В дальнейшем можно переопределить триггер как активный. По умолчанию действует ACTIVE.
• BEFORE | AFTER - указывает, будет выполняться триггер до (BEFORE) или после (AFTER) запоминания изменений в БД.
• DELETE | INSERT | UPDATE - указывает операцию над ТБД, при выполнении которой срабатывает триггер.
• POSITION номер - указывает, каким по счету будет выполняться триггер в случае наличия группы триггеров, обладающих одинаковыми характеристиками операции и времени (до, после операции) вызова триггера. Значение номера задается числом в диапазоне 0..32 767. Триггеры с меньшими номерами выполняются раньше.
Для определения тела триггера используется процедурный язык, рассмотренный в приложении. В него добавляется возможность доступа к старому и новому значениям столбцов изменяемой записи OLD и NEW.
Структура тела триггера.
[<объявление локальных переменных процедуры>]
BEGIN
< оператор>
END
4.3. Значения old и new
Значение OLD.ИмяСтолбца позволяет обратиться к состоянию столбца, имевшему место до внесения возможных изменений, а значение NEW.ИмяСтолбца – к состоянию столбца после внесения возможных изменений. Если значение столбца не изменилось, OLD.ИмяСтолбца будет равно NEW.ИмяСтолбца.
Пример. Если в записи таблицы TOVARY изменилось значение столбца TOVAR, соответствующие изменения должны быть внесены в таблицу RASHOD(дочернюю):
CREATE TRIGGER BU_TOVARY FOR TOVARY
BEFORE UPDATE
AS
BEGIN
IF (OLD.TOVAR <> NEW.TOVAR) THEN
UPDATE RASHOD
SET TOVAR = NEW.TOVAR
WHERE TOVAR = OLD.TOVAR;
END
4.4. Обеспечение каскадных воздействий
Если между двумя или более ТБД установлены отношения ссылочной целостности (отношения "один-ко-многим", "один-к-одному"), при изменении столбца связи в родительской таблице должно быть изменено значение столбца с у записей соответствующих дочерних таблиц. Такое воздействие на дочернюю таблицу носит название каскадного обновления. Если в родительской таблице удалена запись, должны быть удалены все связанные с ней записи в дочерней таблице. Такое воздействие на дочернюю таблицу носит название каскадного удаления.
Ограничение ссылочной целостности таблиц по внешнему ключу приводит к блокировке изменения и удаления записи в родительской таблице, если для нее есть дочерние записи в дочерней таблице:
CREATE TABLE TOVARY(
TOVAR VARCHAR(20) NOT NULL ,
...
PRIMARY KEY (TOVAR));
CREATE TABLE RASHOD (
N_RASH INTEGER NOT NULL,
TOVAR VARCHAR(20) NOT NULL,
…
PRIMARY KEY (N_RASH),
FOREIGN KEY (TOVAR) REFERENCES TOVARY);
Для реализации автоматического выполнения каскадных обновлений и изменений необходимо, во-первых, удалить ссылочные целостности, блокирующие такие изменения в определении БД и, во-вторых, определить сами триггеры для родительской таблицы.
Триггер, реализующий каскадное обновление в дочерней таблице,будет в числе прочих содержать оператор
'IF (OLD.ПoлeCвязиPoдитeля <> NEW.Поле СвязиРодителя) THEN
UPDATE ДочерняяТаблица
SET ПолеСвязиДочернейТаблицы =
NEW. ПолеСвязиРодителя
WHERE ПолеСвязиДочернейТаблицы =
OLD. ПолеСвязиРодителя;
Триггер, реализующий каскадное удаление в дочерней таблице, в числе прочих будет содержать оператор
DELETE FROM ДочерняяТаблица
WHERE ПолеСвязиДочернейТаблицы=
ПолеСвязиРодителя;
Пример. Напишем триггеры, выполняющие каскадные oбновления и каскадные удаления в дочерней таблице RASHOD после соответственно изменения значения столбца связи или удаления записи в родитель TOVARY:
CREATE TRIGGER BU_TOVARY FOR TOVARY
ACTIVE
BEFORE UPDATE
AS
BEGIN
IF (OLD.TOVAR <> NEW.TOVAR) THEN
UPDATE RASHOD
SET TOVAR = NEW.TOVAR
WHERE TOVAR = OLD.TOVAR;
END
CREATE TRIGGER AD__TOVARY FOR TOVARY
ACTIVE
AFTER DELETE
AS
BEGIN
DELETE FROM RASHOD
WHERE RASHOD. TOVAR == TOVARY. TOVAR;
END
Для удаления триггера следует воспользоваться оператором
DROP TRIGGER ИмяТриггера