Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на курсовой проект с примерами / пример - музыкальная школа.doc
Скачиваний:
96
Добавлен:
02.05.2014
Размер:
644.1 Кб
Скачать

5.2 Спецификация ограничений и правил поддержания целостности

Были выявлены следующие правила поддержания целостности:

- при удалении или изменении первичного ключа «код сотрудника» в родительской таблице «Сотрудник» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакт», «Диплом», «Карьера», «Уч-П», «Экзамен», «Учебный план», «Предмет», «Занятие»;

- при удалении или изменении первичного ключа «код учащегося» в родительской таблице «Учащийся» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакты», «Уч-П», «Специализация», «Условия обучения», «Экзамен», «Занятие»;

- при удалении или изменении первичного ключа «номер телефона» в родительской таблице «Телефон» автоматически изменяются или удаляются внешние ключи в дочерних таблицах «Контакт» и «Контакты»;

- при удалении или изменении первичного ключа «код предмета» в родительской таблице «Предмет» автоматически удаляются или изменяются внешние ключи в следующих дочерних сущностях «Экзамен», «У-С», «Занятие»;

-при удалении или изменении первичного ключа «номер учебного плана» в родительской таблице «Учебный план» автоматически удаляются или изменяются внешние ключи следующих дочерних таблиц: «Учащийся», «Четверть»;

- строго запрещается удалять или изменять первичный ключ «номер четверти» родительской сущности «Четверть»;

- при удалении или изменении первичного ключа «код специальности» в родительской таблице «Специальность» автоматически удаляется или изменяется внешний ключ дочерней таблицы «Диплом»;

- при удалении или изменении первичного ключа «код родственника» в родительской таблице «Родственник» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Семья»;

- при удалении или изменении первичного ключа «номер приказа» в родительской таблице «Приказ» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Уч-П»;

- при удалении или изменении первичного ключа «код должности» в родительской таблице «Должность» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Карьера»;

- при удалении или изменении первичного ключа «код инструмента» в родительской таблице «Инструмент» автоматически удаляются или изменяются внешние ключи в дочерних таблицах «Специализация» и «Учебный план»;

- при удалении или изменении первичного ключа «код льготы» в родительской таблице «Льгота» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Условия обучения»;

5.3 Sql-код для создания реляционной модели

  1. CREATE TABLE Сотрудник

(

код_сотрудника INT NOT NULL,

ФИО CHAR(25) NOT NULL,

пол CHAR(1) NOT NULL,

адрес CHAR(15) NOT NULL,

стаж INT NOT NULL,

дата_рождения DATE NOT NULL,

код_паспорта CHAR(15) NOT NULL,

дата_выдачи DATE NULL,

кем_выдан CHAR(10) NULL,

PRIMARY KEY (код_сотрудника, код_паспорта),

CHECK (пол IN ('М', 'Ж')),

CHECK (дата_рождения > CURRENT_DATE () – 100 AND дата_рождения < CURRENT_DATE () – 16)

);

  1. CREATE TABLE Телефон

(

номер_телефона CHAR(10) NOT NULL,

тип_телефона CHAR(10) NULL,

примечания CHAR(15) NULL,

PRIMARY KEY (номер_телефона)

);

  1. CREATE TABLE Должность

(

код_должности INT NOT NULL,

название_должности CHAR(10) NOT NULL,

PRIMARY KEY (код_должности)

);

  1. CREATE TABLE Специальность

(

код_специальности INT NOT NULL,

название_специальности CHAR(10) NOT NULL,

PRIMARY KEY (код_специальности)

);

  1. CREATE TABLE контакт

(

код_сотрудника INT,

номер_телефона CHAR(10),

PRIMARY KEY (код_сотрудника, номер_телефона),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (номер_телефона) REFERENCES Телефон ON

DELETE CASCADE ON UPDATE CASCADE

);

  1. CREATE TABLE Диплом

(

код_диплома CHAR(15) NOT NULL,

код_сотрудника INT,

код_специальности INT,

название_учебного_заведения CHAR(25) NOT NULL,

дата_окончания_учебного_заведения DATE NOT NULL,

PRIMARY KEY (код_диплома, код_сотрудника),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_специальности) REFERENCES Специальность

ON DELETE CSCADE ON UPDATE CASCADE);

  1. CREATE TABLE Карьера

(

код_сотрудника INT,

код_должности INT,

номер_приказа INT NOT NULL,

дата_поступления DATE NOT NULL,

оклад INT NOT NULL,

дата_увольнения DATE NULL,

PRIMARY KEY (код_сотрудника, код_должности),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_должности) REFERENCES Должность ON

DELETE CASCADE ON UPDATE CASCADE

);

  1. CREATE TABLE Учащийся

(

код_учащегося INT NOT NULL,

ФИО CHAR (25) NOT NULL,

дата_рождения DATE NOT NULL,

пол CHAR(1) NOT NULL,

год_обучения INT NOT NULL,

адрес CHAR(25) NOT NULL,

код_свидетельства_о_рождении CHAR (15) NOT NULL,

дата_выдачи DATE NULL,

кем_выдано CHAR (25) NULL,

номер_учебного_плана INT NOT NULL,

PRIMARY KEY (код_учащегося, код_свидетельства),

FOREIGN KEY (номер_учебного_плана) REFERENCES Учебный план ON DELETE CASCADE ON UPDATE CASADE,

CHECK (пол IN ('М', 'Ж')),

CHECK (год_обучения >=1 AND год_обучения <=7),

CHECK (дата_рождения > CURRENT_DATE () – 100 AND дата_рождения < CURRENT_DATE () – 5)

);

  1. CREATE TABLE Родственник

(

код_родственника INT NOT NULL,

ФИО CHAR(25) NOT NULL,

место_работы CHAR (25) NULL,

PRIMARY KEY (код_родственника)

);

  1. CREATE TABLE Приказ

(

номер_приказа INT NOT NULL,

дата_подписания DATE NOT NULL,

код_сотрудника INT,

PRIMARY KEY (номер_приказа),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON DELETE CASCADE ON UPDATE CASCADE

);

  1. CREATE TABLE Инструмент

(

код_инструмента INT NOT NULL,

название_инструмента CHAR(15) NOT NULL,

PRIMARY KEY (код_инструмента)

);

  1. CREATE TABLE Льгота

(

код_льготы INT NOT NULL,

название_льготы CHAR (25) NOT NULL,

PRIMARY KEY (код_льготы)

);

  1. CREATE TABLE Контакты

(

код_учащегося INT,

номер_телефона CHAR (10),

PRIMARY KEY (код_учащегося, номер_телефона),

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (номер_телефона) REFERENCES Телефон ON

DELETE CASCADE ON UPDATE CASCADE

);

14) CREATE TABLE Уч-П

(

код_учащегося INT,

номер_приказа INT,

дата_поступления DATE NOT NULL,

PRIMARY KEY (код_учащегося, номер_приказа),

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (номер_приказа) REFERENCES Приказ ON

DELETE CASCADE ON UPDATE CASCADE

);

15) CREATE TABLE Специализация

(код_учащегося INT,

номер_приказа INT,

код _инструмента INT,

PRIMARY KEY (код_учащегося, номер_приказа),

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (номер_приказа) REFERENCES Приказ ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_инструмента) REFERENCES Интрумент ON

DELETE CASCADE ON UPDATE CASCADE);

16) CREATE TABLE Условия_обучения

(

код_учащегося INT,

код_льготы INT,

плата_за_обучение NUMERIC NOT NULL,

дата_назначения_льготы DATE NULL,

дата_снятия_льготы DATE NULL,

PRIMARY KEY (код_учащегося, код_льготы),

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_льготы) REFERENCES Льгота ON

DELETE CASCADE ON UPDATE CASCADE

);

17) CREATE TABLE Семья

(

код_учащегося INT,

код_родственника INT,

PRIMARY KEY (код_учащегося, код_родственника),

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_родственника) REFERENCES Родственник ON

DELETE CASCADE ON UPDATE CASCADE

);

18) CREATE TABLE Предмет

(

код_предмета INT NOT NULL,

название_предмета CHAR(25) NOT NULL,

код_сотрудника INT,

PRIMARY KEY (код_предмета),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON DELETE CASCADE ON UPDATE CASCADE

);

19) CREATE TABLE Экзамен

(

год INT NOT NULL,

номер_экзамена INT NOT NULL,

код_сотрудника INT,

код_предмета INT,

код_учащегося INT,

дата DATE NOT NULL,

время_начала TIME NOT NULL,

время_окончания TIME NOT NULL,

кабинет INT NOT NULL,

тип_экзамена CHAR(15) NOT NULL,

оценка INT,

PRIMARY KEY (год, номер_экзамена),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_предмета) REFERENCES Предмет ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON

DELETE CASCADE ON UPDATE CASCADE,

CHECK (оценка>=2 AND оценка<=5),

CHECK (время_начала < время_окончания)

);

20) CREATE TABLE Учебный_план

(

номер_учебного_плана INT NOT NULL,

дата_утверждения_учебного_плана DATE NULL,

особенности MEMO NOT NULL,

код_сотрудника INT,

PRIMARY KEY (номер_учебного_плана),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

);

21) CREATE TABLE Четверть

(

год INT,

номер_четверти INT,

номер_учебного_плана INT,

PRIMARY KEY (год, номер_четверти),

FOREIGN KEY (номер_учебного_плана) REFERENCES

Учебный_план ON DELETE CASCADE ON UPDATE CASCADE

);

22) CREATE TABLE Ч-П

(

год INT,

номер_четверти INT,

код_предмета INT,

количество_часов NUMERIC NOT NULL,

PRIMARY KEY (год, номер_четверти, код_предмета),

FOREIGN KEY (год, номер_четверти) REFERENCES Четверть ON

DELETE RESTRICT ON UPDATE RESTRICT,

FOREIGN KEY (код_предмета) REFERENCES Предмет ON

DELETE CASCADE ON UPDATE CASCADE

);

23) CREATE TABLE Занятие

(

дата DATE NOT NULL,

время_начала TIME NOT NULL,

время_окончания TIME NOT NULL,

код_сотрудника INT,

код_предмета INT,

код_учащегося INT,

оценка INT NOT NULL,

PRIMARY KEY (дата, время_начала, время_окончания,

код_сотрудника),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_предмета) REFERENCES Предмет ON

DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON

DELETE CASCADE ON UPDATE CASCADE,

CHECK (оценка >=2 AND оценка <=5),

CHECK (время_начала < время_окончания)

);

24) CREATE TABLE План_Четверть

(

номер_учебного_плана INT,

год INT,

номер_четверти INT,

PRIMARY KEY(номер_учебного_плана, год, номер_четверти),

FOREIGN KEY (номер_учебного_плана) REFERENCES Учебный_план

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (год) REFERENCES Четверть

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (номер_четверти) REFERENCES Четверть

ON DELETE CASCADE ON UPDATE CASCADE

);

25) CREATE TABLE Уволенные_сотрудники

(

код_сотрудника INT,

ФИО CHAR(25),

дата_ увольнения DATE,

PRIMARY KEY (код_сотрудника)

);

Дополнительные ограничения

  1. Для сотрудника дата_поступления – дата_ рождения >=16

CREATE ASSERTION рожд_пост_сотр CHECK

(NOT EXISTS

(SELECT *

FROM Сотрудник, Карьера

WHERE Сотрудник.код_сотрудника= Карьера.код_сотрудника AND Карьера.дата_поступления – Сотрудник.дата_рождения <16));

  1. Для сотрудника

дата_поступления>=дата_окончания_учебного_заведения

CREATE ASSERTION пост_оконч_сотр CHECK

( NOT EXISTS

(SELECT *

FROM Карьера, Диплом

WHERE Карьера.код_сотрудника= Диплом.код_сотрудника AND Карьера.дата_поступления<диплом.дата_окончания_учебного_заведения));

  1. Для учащегося дата_поступления – дата_рождения >=5

CREATE ASSERTION рожд_пост_уч CHECK

( NOT EXISTS

(SELECT *

FROM Учащийся, Уч-П

WHERE Учащийся.код_учащегося= Уч-П.код_учащегося AND

Уч-П.дата_поступления – Учащийся.дата_рождения <5));

  1. При увольнении сотрудника табельные номера следующих за ним в списке сотрудников уменьшаются на 1

CREATE TRIGGER SCODE

ON Сотрудник

FOR DELETE

AS

UPDATE Сотрудник ON

SET Сотрудник.код_сотрудника= Сотрудник.код_сотрудника – 1

FROM Сотрудник, DELETED

WHERE Сотрудник.код_сотрудника > DELETED.код_сотрудника;

5) При исключении учащегося коды следующих за ним в списке учащихся уменьшаются на 1

CREATE TRIGGER UCODE

ON Учащийся

FOR DELETE

AS

UPDATE Учащийся ON

SET Учащийся.код_учащегося= Учащийся.код_учащегося – 1

FROM Учащийся, DELETED

WHERE Учащийся.код_учащегося > DELETED.код_учащегося;

Триггера для Microsoft SQL Server

6) Данные об уволенных сотрудниках заносятся в таблицу «Уволенные_сотрудники»

CREATE TRIGGER Увольнение

ON Сотрудник

FOR DELETE

AS

INSERT INTO Уволенные_сотрудники

VALUES (DELETED.код_сотрудника, DELETED.ФИО, DELETED.дата_увольнения);

7) Из таблицы «Уволенные_сотрудники» удаляются данные о сотруднике, уволенном более одного месяца назад

CREATE TRIGGER Проверка

ON Уволенные_сотрудники

FOR UPDATE

AS

DELETE

FROM Уволенные_сотрудники

WHERE CURRENT_DATE() – дата_увольнения >=30;