Триггеры в рекурсивных структурах

Создание структуры таблицы, реализующей рекурсивную иерархию. Примеры данных, описывающих отношения подчиненности между сотрудниками. Реализация правил целостности данных. Добавление и изменение записи в таблице. Возможности удаления записи о директоре.

Рубрика Программирование, компьютеры и кибернетика
Вид лекция
Язык русский
Дата добавления 27.04.2017
Размер файла 29,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Лекция 10

Триггеры в рекурсивных структурах

Введение в рекурсивные структуры

Рассмотрим создание таблицы, реализующей рекурсивную иерархию, на примере данных, описывающих отношения подчиненности между сотрудниками. В таблице emp_mgr необходимо задать как имя сотрудника ( emp ), так и имя его начальника ( mgr ). Для рекурсивной связи одна и та же сущность является и родительской, и дочерней. При задании рекурсивной связи атрибут первичного ключа мигрирует в качестве внешнего ключа в состав неключевых атрибутов той же сущности (атрибуты emp - сотрудник и mgr - начальник таблицы emp_mgr ). Информация о руководителе содержится в той же сущности, поскольку руководитель - сотрудник той же организации. Связь руководит/подчиняется ( fk_emp ) позволяет хранить древовидную иерархию подчиненности. Такой вид рекурсивной связи называется иерархической рекурсией и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности), но подчиненный - только одного руководителя. В среде MS SQL Server создадим таблицу emp_mgr:

CREATE TABLE emp_mgr

(emp CHAR(2) PRIMARY KEY,

mgr CHAR(2) NULL,

NoOfReports INT DEFAULT 0,

CONSTRAINT fk_emp FOREIGN KEY (mgr)

REFERENCES emp_mgr (emp) )

В таблицу введено поле NoOfReports, в котором для каждого сотрудника определено количество его подчиненных.

Для удобства иллюстрации в качестве имени сотрудника и его начальника будут использоваться латинские буквы. Например, ввод данных в таблицу осуществляется операторами:

INSERT INTO emp_mgr(emp,mgr) VALUES('a',NULL)

INSERT INTO emp_mgr(emp,mgr) VALUES('b','a')

INSERT INTO emp_mgr(emp,mgr) VALUES('c','a')

INSERT INTO emp_mgr(emp,mgr) VALUES('d','a')

INSERT INTO emp_mgr(emp,mgr) VALUES('e','b')

INSERT INTO emp_mgr(emp,mgr) VALUES('f','b')

INSERT INTO emp_mgr(emp,mgr) VALUES('g','b')

INSERT INTO emp_mgr(emp,mgr) VALUES('i','c')

INSERT INTO emp_mgr(emp,mgr) VALUES('k','d')

После ввода данных в таблицу emp_mgr оператор SELECT * FROM emp_mgr возвращает следующий результат:

emp mgr NoOfReports

-------------------------

a NULL 3

b a 3

c a 1

d a 1

e b 0

f b 0

g b 0

i c 0

k d 0

Реализация правил целостности данных

Целостность, непротиворечивость и достоверность информации в таблицах с рекурсивными связями обеспечиваются выполнением ряда правил:

1. Каждый сотрудник имеет только одного руководителя.

2. Каждый сотрудник не является сам себе руководителем.

3. Каждый руководитель в первую очередь сотрудник.

4. Имеется только один сотрудник (директор организации), который никому не подчиняется.

5. Правило 2 необходимо усилить. Каждый сотрудник не должен находиться в роли собственного руководителя не только непосредственно, но и опосредствованно, через других сотрудников.

Выполнение правила 1 обеспечивается ограничением первичного ключа и не требует дополнительных SQL-операторов.

Рассмотрим правило 2. Имена сотрудника и его начальника в одной записи не должны совпадать. При добавлении и изменении записи в таблице emp_mgr это требование предъявляется к новой записи, которая до подтверждения транзакции располагается во временной таблице с именем inserted. Этому правилу соответствуют следующие SQL-операторы:

IF EXISTS (SELECT * FROM inserted

WHERE mgr=emp)

BEGIN

ROLLBACK TRAN

RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10)

RETURN

END

Правило 3 говорит о том, что именем начальника может быть только уже внесенное в таблицу имя сотрудника. Это требование представляет собой декларативную ссылочную целостность и обеспечиваетсяограничением внешнего ключа. Однако, чтобы запустить механизм триггеров, придется удалить ограничение внешнего ключа и его функцию возложить на триггер.

В новой или измененной записи имя начальника должно быть указано и уже присутствовать в таблице в качестве имени сотрудника, что может быть записано следующими SQL-операторами:

IF EXISTS(SELECT * FROM inserted

WHERE mgr IS NOT NULL) AND

NOT EXISTS(SELECT * FROM inserted,emp_mgr

WHERE emp_mgr.emp=inserted.mgr)

BEGIN

RAISERROR('НЕТ НАЧАЛЬНИКА',16,10)

ROLLBACK TRAN

RETURN

END

или (что эквивалентно)

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

RETURN

END

В соответствии с правилом 4 необходимо проверить, введена ли запись о директоре (сотруднике, у которого нет начальника). Если такая запись уже есть, ввод нового директора запрещается с помощью следующих SQL-операторов:

IF 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)

RETURN

END

Оператор UPDATE может изменить иерархическую структуру таким образом, что возникает ситуация, когда сотрудник становится начальником самому себе через других сотрудников, т.е. в иерархии подчиненности возникает петля. Для исключения подобных преобразований используем SQL-операторы:

IF UPDATE(mgr)--изменился начальник

BEGIN

DECLARE @x CHAR(2), @y CHAR(2), @xx CHAR(2)

--узнали имя сотрудника,

--у которого изменился начальник

SELECT @xx=inserted.emp FROM inserted

SELECT @x=@xx

SELECT @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

END

END

Чтобы сработали триггеры, необходимо удалить ограничение внешнего ключа:

ALTER TABLE emp_mgr DROP CONSTRAINT fk_emp

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

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

ALTER TRIGGER emp_ins

ON emp_mgr FOR INSERT

AS

--Правило 2

IF EXISTS (SELECT * FROM inserted WHERE mgr=emp)

BEGIN

ROLLBACK TRAN

RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10)

RETURN

END

--Правило 4

IF 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)

RETURN

END

--Правило 3

IF EXISTS(SELECT * FROM inserted

WHERE mgr IS NOT NULL) AND

NOT EXISTS(SELECT * FROM inserted,emp_mgr

WHERE emp_mgr.emp=inserted.mgr)

BEGIN

RAISERROR('НЕТ ТАКОГО НАЧАЛЬНИКА',16,10)

ROLLBACK TRAN

RETURN

END

--Пересчет числа подчиненных у начальника

--добавленного подчиненного

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. Триггер для добавления записи в таблицу.

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

CREATE TRIGGER emp_upd ON emp_mgr

FOR UPDATE

AS таблица рекурсивный иерархия подчиненность

IF UPDATE(mgr)

BEGIN

--Правило 5

DECLARE @x CHAR(2), @y CHAR(2), @xx CHAR(2)

SELECT @xx=inserted.emp FROM inserted

SELECT @x=@xx

SELECT @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

END

END

--Правило 2

IF EXISTS (SELECT * FROM inserted WHERE mgr=emp)

BEGIN

ROLLBACK TRAN

RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10)

RETURN

END

--Правило 4

IF 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)

RETURN

END

--Правило 3

IF 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

RETURN

END

IF 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.mgr

END

IF UPDATE(emp)

--если изменилось имя сотрудника, следует изменить

--имя начальника у всех его подчиненных

UPDATE emp_mgr SET emp_mgr.mgr=inserted.emp

FROM emp_mgr, inserted, deleted WHERE

emp_mgr.mgr=deleted.emp

Пример 15.2. Триггер для изменения записи в таблице.

Попытка подчинить сотрудника с именем `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 4

b a 1

c a 1

d a 1

e f 0

f b 1

g a 0

i c 0

k d 0

Удаление записи из рекурсивной структуры

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)

RETURN

END

Пример 15.3. Триггер для удаления записи из таблицы.

Попытка удаления записи о директоре будет отвергнута сервером:

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 5

c a 1

d a 1

e a 0

f a 0

g a 0

i c 0

k d 0

Размещено на Allbest.ru

...

Подобные документы

  • Структура таблицы и типы данных. Ввод данных в ячейки таблицы. Создание запросов на выборку, удаление, обновление и добавление записей, на создание таблицы. Основное различие между отчетами и формами, их назначение. Создание отчетов для базы данных.

    курсовая работа [1,9 M], добавлен 17.06.2014

  • Синтаксис, типы данных, используемые в базе данных MySQL. Создание и удаление базы данных, создание таблицы и удаление таблицы, изменение ее свойств. Переименование, вставка и удаление столбцов, изменение их свойств. Обновление и поиск записей в таблице.

    лабораторная работа [641,7 K], добавлен 04.03.2010

  • Создание программы для обработки структуры данных. Возможность ввода и записи данных на персональном компьютере. Прикладное программирование на языке Turbo Pascal. Свободное редактирование записанных данных с помощью программы, написанной на Turbo Pascal.

    лабораторная работа [11,4 K], добавлен 13.05.2011

  • Типы ограничений, поддерживающие целостность в реляционной модели данных. Определение значения поля первичного ключа с помощью генератора. Добавление, изменение и удаление записей в таблицу базы данных "Библиотека" на языке программирования SQL.

    лабораторная работа [30,5 K], добавлен 10.10.2012

  • Разработка программы для работы с множеством данных, перечень и работа ее модулей. Проверка работы программы. Реализация поиска элемента в файле по его номеру и добавление элементов в конец уже созданного НД. Возможности и особенности применения программы

    курсовая работа [3,5 M], добавлен 22.06.2012

  • Принципы разработки и примеры работы программы, реализующей основные операции над базами данных (выбор, добавление, модификация и удаление данных), ее функциональные модели и блок-схемы. Особенности выполнения запроса и скорость операций обновления.

    курсовая работа [853,4 K], добавлен 25.01.2010

  • Создание баз данных с помощью Transact-SQL. Специализированные типы данных. Обеспечение целостности ссылок. Преимущества хранимых процедур. Синтаксис запроса на создания триггера. Фиксированные серверные роли. Предоставление прав на объекты в базе данных.

    лабораторная работа [2,2 M], добавлен 12.09.2012

  • Составление таблицы согласно образцу в программе MS Excel. Создание данных таблицы базы данных. Введение формул в программе MS Excel. Установление связи между таблицами. Создание запроса на выборку данных из одной таблицы с помощью мастер запросов.

    контрольная работа [4,0 M], добавлен 17.04.2016

  • Использование электронной таблицы как базы данных. Сортировка и фильтрация данных в Microsoft Excel 97. Сортировка - это упорядочение данных по возрастанию или по убыванию. При фильтрации базы отображаются только записи, обладающие нужными свойствами.

    реферат [6,6 K], добавлен 17.11.2002

  • Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.

    курсовая работа [336,2 K], добавлен 27.06.2015

  • Разработка алгоритмов на динамических структурах данных. Описание структуры данных "стек". Процедуры добавления и удаления элемента, очистки памяти. Код распечатки содержимого всего стека. Инструкция пользователя, код программы, контрольный пример.

    курсовая работа [22,9 K], добавлен 19.10.2010

  • Заполнение базы данных по систематизации млекопитающих, ее программный код. Запись условий, при которых добавление записи в базу данных невозможно. Переменные, используемые для нахождения повторения. Создание файла bd.dat, в котором будут хранится данные.

    курсовая работа [190,5 K], добавлен 03.06.2014

  • Проектирование базы данных "Общежитие" в СУБД Microsoft Access. Создание запросов, состоящих из комбинаций разных типов данных. Создание форм и полей таблицы в режиме конструктора. Ввод и просмотр данных в режиме таблицы, создание связей между ними.

    курсовая работа [4,3 M], добавлен 24.06.2019

  • Анализ предметной области. Проектирование базы данных и ее реализация. Проектирование правил целостности базы данных. Анализ реляционной модели. Примеры экранных форм интерфейса. Программный код, содержащий функции взаимодействия с базой данных.

    курсовая работа [849,8 K], добавлен 19.05.2013

  • Создание простых форм-справочников. Редактирование свойств формы в режиме конструктора. Добавление и редактирование свойств элементов управления. Проектирование отчётов для базы данных. Приведение таблицы к нормальной форме и построение схемы данных.

    реферат [138,0 K], добавлен 23.11.2008

  • Разработка подсистемы отдела кадров, предназначенной для работы с базой данных в виде типизированного файла с расширением txt. Анализ возможности редактировать записи, осуществления выборки данных на основе правил отбора и построения графиков и диаграмм.

    контрольная работа [125,3 K], добавлен 08.06.2011

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

    практическая работа [4,4 M], добавлен 02.04.2009

  • Создание программного продукта на языке Pascal в визуальной среде программирования Borland Developer Studio в консольном приложении. Разработка типизированного файла для записи данных и их вывод на экран, добавление данных в конец файла, поиск информации.

    курсовая работа [1,0 M], добавлен 04.12.2011

  • Цель информационного программирования; алгоритмический язык как система обозначений и правил для единообразной и точной записи алгоритмов и их исполнения. Языки программирования низкого и высокого уровня; классификация и использование структуры данных.

    реферат [383,1 K], добавлен 07.01.2012

  • Функции базы данных Access: организация, добавление и изменение информации, связывание таблиц, макросы, модули, средства печати. Элементы базы данных: запросы, таблицы, формы и отчеты. Виды запросов: на выборку, перекрестные, на изменение, с параметрами.

    реферат [2,1 M], добавлен 16.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.