Шаг 29 - Триггеры и удаление

В момент удаления записи (команда DELETE) срабатывает триггер удаления. Так же он сработает и при удалении записи клиентом на основе ADO или других технологий доступа к БД. Можно создавать триггер и только на удаление.

CREATE TRIGGER DELETE_CAR ON dbo.allcar 
FOR DELETE 
AS

Он будет отображаться специальным значком.

gif/29_1.gif (1295 b)

В момент срабатывания триггера удаления создается таблица deleted, куда помещаются удаленные записи, эти записи больше не существуют в базе данных и находятся в кэше. Значит этой таблицей можно воспользоваться.

CREATE TRIGGER DELETE_CAR ON dbo.allcar 
FOR DELETE 
AS
SELECT * FROM deleted

Давайте запретим удалять автомобили с типом 2, то есть легковые.

CREATE TRIGGER DELETE_CAR ON dbo.allcar 
FOR DELETE 
AS
IF (SELECT COUNT(*)  FROM deleted  WHERE deleted.type=2)>0
BEGIN
 ROLLBACK TRANSACTION
END

Мы здесь написали, если количество удаляемых записей в таблицу deleted с типом 2 больше чем 0 (то есть они есть, то надо запретить удаление). Вот тут нас ждут интересные веши. Например, если клиент ACCESS, то он удаляет запись и больше ее не показывает в таблице.

gif/29_2.gif (5731 b)

Но стоит сделать любую операцию, которая обновляет записи, например, сортировку, как она тут же появляется снова.

gif/29_3.gif (2746 b)

То есть ни какой реакции на отмену транзакции в триггере. В данном случае мы использовали триггер, как средство для реализации бизнес логики. Подходы здесь могут быть изощренные. Например, что какие-то данные должны храниться не менее трех лет с момента занесения или признаки, по которым нельзя удалять клиента из базы данных.


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