- •Лабораторная №1 Проектирование структуры базы данных. Нормализация таблиц.
- •О бозначение таблиц и полей
- •Лабораторная №2 Создание серверной части приложения: алиас, файл базы данных, таблицы.
- •Лабораторная №3, №4 Визуальное проектирование структуры базы данных: таблицы, индексы, условия ссылочной целостности, взаимосвязи.
- •Примечание
- •Лабораторная №5, №6 Клиентская часть: размещение не визуальных компонентов, соединение с бд. Клиентская часть: размещение визуальных компонентов, отображение таблиц.
- •Лабораторная №7, №8 Запросы на добавление данных. Запросы на редактирование и удаление данных.
- •Лабораторная №9 Создание генераторов и триггеров. Каскадные воздействия.
- •Лабораторная №10 Создание хранимых процедур.
- •Лабораторная №11 Сортировка, поиск, фильтрация данных: в базе данных и выборках.
- •Лабораторная №12, №13 Работа с транзакциями. Кэширование изменений при работе с транзакциями.
- •Лабораторная №14 Обеспечение достоверности данных и перехват исключительных ситуаций.
- •Лабораторная №15 Работа с отчетами.
- •Лабораторная №16 Установление привилегии доступа.
- •Лабораторная №17 Копирование и восстановление данных.
- •Лабораторная №18 Копирование клиентской части
- •Список рекомендуемых баз данных
Лабораторная №9 Создание генераторов и триггеров. Каскадные воздействия.
Цель работы: научится создавать, ставить на выполнение, редактировать и удалять триггер; создавать, ставить на выполнение, редактировать и удалять генератор.
Триггеры
Триггер — это процедура, автоматически исполняемая SQL-сервером при наступлении события "обновление", "удаление" или "добавление" новой записи таблицы. По отношению к инициализирующему их событию различают два типа триггеров:
выполняемые до или после наступления события;
автоматически обеспечивающие каскадные воздействия в дочерних таблицах при изменении, удалении записи в родительской таблице.
Нельзя вызывать триггер непосредственно из программы, передавать ему входные параметры и возвращать их значения. Триггеры всегда реализуют действие.
Создание триггеров
Триггер создается SQL-командой:
CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы
[ACTIVE/INACTIVE]
{BEFORE/AFTER}
{DELETE/INSERT/UPDATE}
[POSITION номер]
AS <тело триггера>[;]
Структура тела триггера:
[<объявление локальных переменных процедуры>]
BEGIN
<оператор>
[<оператор>]
END
Значение номера задается числом. Триггеры с меньшими номерами выполняются раньше.
Создадим триггер для родительской таблицы Realty, который при изменении значения ее первичного ключа будет автоматически изменять значение внешнего ключа дочерней таблицы Lease, другими словами, если в таблице Realty изменилось значение поля Adr, то триггер изменит значение поля Adr в соответствующей записи таблицы Lease.
Ход работы:
Запустите утилиту Interactive SQL.
Создайте триггер updat_realty.
CREATE TRIGGER UPDAT_REALTY FOR Realty
ACTIVE
BEFORE UPDATE
AS BEGIN
IF (OLD.Adr <> NEW.Adr) THEN UPDATE Lease
SET Adr = NEW.Adr WHERE Adr = OLD.Adr;
END
Попробуйте изменить значение адреса в таблице Realty. Как видите, это не удается. ПОЯСНИТЕ.
Сообщение о нарушении ссылочной целостности
Изменение значения адреса в таблице Realty
4. Удалите связь между таблицами Realty и Lease (ограничение INTEG_7):
ALTER TABLE Lease
DROP CONSTRAINT INTEG_7
М
ожете
убедиться, что она отсутствует: теперь
таблица Lease
не связана с
Realty.Измените значение адреса в таблице Realty.
Просмотр связей таблицы Lease
Как видите, теперь при изменении значения ее первичного ключа триггер автоматически изменяет значение внешнего ключа дочерней таблицы Lease. Другими словами, реализован механизм обеспечения ссылочной целостности "cascade".
Создание генераторов
Генераторы предназначены для обеспечения уникальности значений ключевых столбцов и используются совместно с триггерами
Ход работы:
При создании таблицы Owner поле Non было объявлено как ключевое целочисленного типа.
Создадим генератор GenStore, который при обращении к нему возвращает уникальное целочисленное значение:
CREATE GENERATOR GenStore
SET GENERATOR GenStore TO 1;
Создадим триггер, который при добавлении к таблице новой записи обращается к генератору и заносит возвращаемое им значение в ключевое поле.
CREATE TRIGGER NZ_Non FOR Owner
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.Non=GEN_ID (GenStore,1);
END
Контрольные задания:
Создать триггер для родительской таблицы Owner, который при изменении значения ее первичного ключа будет автоматически изменять значение внешнего ключа дочерней таблицы Lease, т.е. если в таблице Owner изменилось значение поля NOn, то триггер изменит значение поля NOn в соответствующей записи таблицы Lease.
Создать триггер для каскадного удаления записей из таблицы Realty и Lease.
