Удаление записи из рекурсивной структуры
ALTER TRIGGER emp_delON emp_mgrFOR DELETEASDECLARE @e CHAR(2), @m CHAR(2), @r INTSELECT @e=emp,@m=mgr,@r=NoOfReports FROM deletedIF @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) RETURN ENDПример 15.3. Триггер для удаления записи из таблицы. (html, txt)
Попытка удаления записи о директоре будет отвергнута сервером:
DELETE FROM emp_mgr WHERE emp='a'Server: Msg 50000, Level 16, State 10, Procedure emp_del, Line 24НЕЛЬЗЯ УДАЛЯТЬ ДИРЕКТОРАВ результате удаления рядового сотрудника с именем b его подчиненные e, f и g станут подчиненными сотрудника с именем a.
DELETE FROM emp_mgr WHERE emp='b'Первоначальное содержимое таблицы emp_mgr изменится следующим образом:
emp mgr NoOfReports-------------------------a NULL 5c a 1d a 1e a 0f a 0g a 0i c 0k d 0
Лекция: Транзакции и блокировки
Дата добавления: 2015-08-26; просмотров: 944;