Изменение записи в рекурсивной структуре
CREATE TRIGGER emp_upd ON emp_mgrFOR UPDATEASIF UPDATE(mgr)BEGIN--Правило 5DECLARE @x CHAR(2), @y CHAR(2), @xx CHAR(2)SELECT @xx=inserted.emp FROM insertedSELECT @x=@xxSELECT @y='*'WHILE @y IS NOT NULL BEGIN SELECT @y=mgr FROM emp_mgr WHERE emp=@x IF @xx=@y BEGIN RAISERROR('транзитивное замыкание',16,10) ROLLBACK TRAN RETURN END ELSE SELECT @x=@y ENDEND--Правило 2IF EXISTS (SELECT * FROM inserted WHERE mgr=emp)BEGIN ROLLBACK TRAN RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10) RETURNEND--Правило 4IF EXISTS (SELECT * FROM inserted WHERE mgr IS NULL) AND EXISTS (SELECT * FROM emp_mgr,inserted WHERE emp_mgr.mgr IS NULL AND emp_mgr.emp<>inserted.emp)BEGIN ROLLBACK TRAN RAISERROR('ОДИН ДИРЕКТОР УЖЕ ЕСТЬ',16,10) RETURNEND--Правило 3IF UPDATE(mgr) IF NOT EXISTS(SELECT * FROM emp_mgr, inserted WHERE emp_mgr.emp=inserted.mgr OR inserted.mgr IS NULL)BEGIN RAISERROR('НЕТ ТАКОГО НАЧАЛЬНИКА',16,10) ROLLBACK TRAN RETURNENDIF UPDATE(mgr)--пересчет числа подчиненных у старого и нового--начальниковBEGIN UPDATE emp_mgr SET emp_mgr.NoOfReports=emp_mgr.NoOfReports+1 FROM inserted WHERE emp_mgr.emp=inserted.mgr UPDATE emp_mgr SET emp_mgr.NoOfReports=emp_mgr.NoOfReports-1 FROM deleted WHERE emp_mgr.emp=deleted.mgrENDIF UPDATE(emp)--если изменилось имя сотрудника, следует изменить--имя начальника у всех его подчиненныхUPDATE emp_mgr SET emp_mgr.mgr=inserted.empFROM emp_mgr, inserted, deleted WHEREemp_mgr.mgr=deleted.empПример 15.2. Триггер для изменения записи в таблице. (html, txt)
Попытка подчинить сотрудника с именем ‘b’ начальнику с именем ‘e’ будет сервером отвергнута, иначе в организации сложилась бы такая ситуация: сотрудник ‘e’ подчинятся сотруднику ‘b’, а сотрудник ‘b’ подчиняется сотруднику ‘e’.
UPDATE emp_mgr SET mgr='e' WHERE emp='b'Server: Msg 50000, Level 16, State 10, Procedure emp_upd, Line 15 транзитивное замыканиеВыполнение команды
UPDATE emp_mgr SET mgr='f' WHERE emp='e'и команды
UPDATE emp_mgr SET mgr='a' WHERE emp='g'приведет к следующему изменению первоначальной иерархической структуры:
emp mgr NoOfReports-------------------------a NULL 4b a 1c a 1d a 1e f 0f b 1g a 0i c 0k d 0Дата добавления: 2015-08-26; просмотров: 842;