Шаг 30 - Триггеры удаления и поддержка целостности базы данных

Целостность базы данных и задача ее поддержания возникает когда есть серия связанных таблиц. Связи могут быть разные, об этом читайте "Шаг 116 - Связи один ко многим" и "Шаг 117 - Связь многие ко многим". Тут возникает некоторая сложность. В нашем примере с автомобилем может произойти ситуация, когда мы захотим удалить тип автомобиля из таблицы type, а упоминание об этом типе останется в таблице allcar. Как результат нарушение целостности.

gif/30_1.gif (5384 b)

Эту ситуацию можно контролировать с использованием триггеров удаления. Давайте создадим триггер удаления на таблицу type:

if exists (select * from sysobjects where id = object_id('dbo.DELETE_TYPE') and sysstat & 0xf = 8)
	drop trigger dbo.DELETE_TYPE
GO

CREATE TRIGGER DELETE_TYPE ON dbo.type 
FOR DELETE 
AS
DELETE allcar FROM allcar,deleted WHERE allcar.type=deleted.id_type
GO

Мы написали "удалить из таблицы allcar все записи, если тип автомобиля совпадает с типом в удаляемой записи из таблицы типов". Теперь при удалении записи из таблицы type.

gif/30_2.gif (2943 b)

Будут удаляться записи из таблицы allcar:

gif/30_3.gif (2488 b)

Внимание, если у Вас сохранился триггер на запрет удаления из прошлого шага, то удалить автомобили, которые являются легковыми у Вас не получится. Удалите триггер на запрет удаления легковых автомобилей. Сначала попробуйте конечно, а потом удалите. Вы посмотрите, что отмена транзакции ведет к отмене удаления из type.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.