русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Изменение записи в рекурсивной структуре


Дата добавления: 2013-12-23; просмотров: 724; Нарушение авторских прав


Добавление записи в рекурсивную структуру

ALTER TRIGGER emp_insON emp_mgr FOR INSERTAS--Правило 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 EXISTS(SELECT * FROM inserted WHERE mgr IS NOT NULL) ANDNOT EXISTS(SELECT * FROM inserted,emp_mgr WHERE emp_mgr.emp=inserted.mgr)BEGIN RAISERROR('НЕТ ТАКОГО НАЧАЛЬНИКА',16,10) ROLLBACK TRAN RETURNEND--Пересчет числа подчиненных у начальника--добавленного подчиненногоDECLARE @e CHAR(2), @m CHAR(2) SELECT @e=emp_mgr.emp FROM emp_mgr, inserted WHERE emp_mgr.emp=inserted.mgr UPDATE emp_mgr SET emp_mgr.NoOfReports=emp_mgr.NoOfReports+1 WHERE emp_mgr.emp=@e

Пример 15.1. Триггер для добавления записи в таблицу. (html, txt)

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


<== предыдущая лекция | следующая лекция ==>
 | Введение в транзакции


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.