Удаление записи из рекурсивной структуры
Пример 15.3. Триггер для удаления записи из таблицы.
ALTER TRIGGER emp_del
ON emp_mgr
FOR DELETE
AS
DECLARE @e CHAR(2), @m CHAR(2), @r INT
SELECT @e=emp,@m=mgr,@r=NoOfReports FROM deleted
IF @m IS NOT NULL
--удаляется сотрудник, не являющийся директором
BEGIN
IF @r=0
-- удаляется сотрудник, у которого нет подчиненных
-- уменьшается число подчиненных у начальника
-- удаляемого сотрудника
UPDATE emp_mgr SET NoOfReports=
NoOfReports-1
WHERE emp=@m
ELSE
BEGIN
-- удаляется сотрудник, у которого есть подчиненные
-- переподчиним его подчиненных его начальнику,
т.е.
-- начальником подчиненных удаляемого сотрудника
-- становится его начальник
UPDATE emp_mgr SET NoOfReports=
NoOfReports+@r-1
WHERE emp=@m
UPDATE emp_mgr SET mgr=@m
WHERE mgr=@e
END
END
ELSE
--Правило 4
IF EXISTS(SELECT * FROM emp_mgr)
BEGIN
ROLLBACK TRAN
RAISERROR('НЕЛЬЗЯ УДАЛЯТЬ
ДИРЕКТОРА',16,10)
351
Лекция 15 Триггеры в рекурсивных структурах