Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
маркин.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
928.26 Кб
Скачать

4. Скрипт по созданию модифицированной бд

Ниже приведены скрипты по созданию модифицированной БД оговоренной в задании с соответствующими комментариями.

  1. Создание таблицы "Jobs" ("Должности").

/*Создание домена Boolean*/

CREATE DOMAIN Boolean AS SMALLINT CHECK (VALUE IN (0, 1));

/*Создание таблицы "Должности"("Jobs")*/

CREATE TABLE Jobs(

ID_Job INTEGER,

Name VARCHAR(20),

Flag_usluga BOOLEAN);

/* Добавление в таблицу "Сотрудники"("Workers") поля "Код должности"("ID_Job")*/

ALTER TABLE Workers

ADD ID_Job INTEGER NOT NULL;

/*Создание вспомогательного генератора для поля "Код должности"*/

CREATE GENERATOR ID_Job_G;

SET GENERATOR ID_Job_G TO 0;

/*Создание процедуры для переноса информации о должностях из таблицы "Сотрудники"("Workers") в таблицу "Должности"("Jobs")*/

SET TERM !! ;

CREATE PROCEDURE Job_new

AS

BEGIN

/* Вставка в таблицу "Должности"("Jobs") разных значений поля "Наименование должности"("Job") и установка поля "Флаг услуги"("Flag_Usluga") в 0 или 1*/

INSERT INTO Jobs(Name, Flag_Usluga)

SELECT DISTINCT J.Job, (IIF(J.Job='Инструктор',1,0))

FROM (SELECT Job FROM Workers) AS J(Job);

/* Вставка в таблицу "Должности"("Jobs") поля "Код должности", полученного из генератора уникальных значений ID_Job_G*/

UPDATE Jobs J

SET J.ID_Job=GEN_ID(ID_Job_G,1);

/* Вставка в таблицу "Сотрудники"("Workers") поля "Код должности"("ID_Job")*/

UPDATE Workers W

SET W.ID_Job=(SELECT J.ID_Job FROM Jobs J

WHERE J.Name=W.Job);

END!!

SET TERM ; !!

/* Выполнить процедуру Job_new*/

EXECUTE PROCEDURE Job_new;

COMMIT WORK;

/* В строках исходной таблицы не должно быть NULL значений, для созданной таблицы "Должности"("Jobs") изменим состояние флага*/

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1

WHERE (RDB$FIELD_NAME = 'ID_JOB') AND

(RDB$RELATION_NAME = 'JOBS');

/* Добавляем ограничение первичного ключа для таблицы "Должности" */

ALTER TABLE Jobs ADD CONSTRAINT PK_Job

PRIMARY KEY (ID_JOB);

/* Внешний ключ для таблицы "Сотрудники" */

ALTER TABLE Workers ADD CONSTRAINT FK_Worker

FOREIGN KEY (ID_JOB) REFERENCES Jobs(ID_JOB)

ON UPDATE CASCADE;

/* Удаление процедуры Job_new */

DROP procedure Job_new;

/* Удаление поля "Должности" из таблицы "Сотрудники"*/

ALTER TABLE Workers DROP Job;

Проверим правильность работы модификации.

Исходная таблица "Сотрудники"("Workers") до модификации имела вид, приведенный в таблице 15.

Таблица 15. Исходная таблица "Сотрудники"

ID_WORKER

FIO

ADRES

TELEFON

PASSPORT

JOB

1

Николаева Ж.П.

ул.Гагарина, д.80, кв.101

212121

1212 675483

Инструктор

2

Карпов А.Т.

ул.Пушкина, д.11, кв.301

89203045678

0002 321456

Инструктор

3

Беликова А.И.

ул.Пушкина, д.10, кв.100

89201001010

0001 101010

Администратор

4

Локтанова Ю.А.

ул.Новоселов, д.13, кв.20

543636

0212 231244

Администратор

5

Зубаревич Ю.И.

ул.Ленина, д.54, кв.75

756464

3000 217637

Инструктор

6

Сомина Л.О.

ул.Затинная, д.1, кв.2

767676

0978 218738

Инструктор

7

Одина О.В.

ул.4 Линия, д.11, кв.7

777777

0007 325782

Инструктор

После модификации появилась новая таблица "Должности"("Jobs"), приведенная в таблице 16.

Таблица 16. Новая таблица "Должности"

ID_JOB

NAME

FLAG_USLUGA

1

Администратор

0

2

Инструктор

1

При этом таблица "Сотрудники"("Workers") модифицировалась в таблицу, приведенную в таблице 17.

Таблица 17. Модифицированная таблица "Сотрудники"

ID_WORKER

FIO

ADRES

TELEFON

PASSPORT

ID_JOB

1

Николаева Ж.П.

ул.Гагарина, д.80, кв.101

212121

1212 675483

2

2

Карпов А.Т.

ул.Пушкина, д.11, кв.301

89203045678

0002 321456

2

3

Беликова А.И.

ул.Пушкина, д.10, кв.100

89201001010

0001 101010

1

4

Локтанова Ю.А.

ул.Новоселов, д.13, кв.20

543636

0212 231244

1

5

Зубаревич Ю.И.

ул.Ленина, д.54, кв.75

756464

3000 217637

2

6

Сомина Л.О.

ул.Затинная, д.1, кв.2

767676

0978 218738

2

7

Одина О.В.

ул.4 Линия, д.11, кв.7

777777

0007 325782

2

  1. Создание таблицы "Halls" (“Помещения”).

/*Создание таблицы "Помещения"("Halls")*/

CREATE TABLE Halls(

ID_Hall INTEGER,

Name VARCHAR(20));

/* Добавление в таблицу "Расписание занятий"("Timetable") поле "Код помещения"("ID_Hall")*/

ALTER TABLE Timetable

ADD ID_Hall INTEGER NOT NULL;

/*Создание вспомогательного генератора для поля "Код помещения"*/

CREATE GENERATOR ID_Hall_G;

SET GENERATOR ID_Hall_G TO 0;

/*Создание процедуры для переноса информации о помещениях из таблицы "Расписание занятий"("Timetable") в таблицу "Помещения"("Halls")*/

SET TERM !! ;

CREATE PROCEDURE Hall_new

AS

BEGIN

/* Вставка в таблицу "Помещения"("Halls") разных значений поля "Наименование помещения"("Hall") из таблицы "Расписание занятий"("Timetable")*/

INSERT INTO Halls(Name)

SELECT DISTINCT T.Hall FROM

(SELECT Hall FROM Timetable) AS T(Hall);

/* Вставка в таблицу "Помещения"("Halls") поля "Код помещения", полученного из генератора уникальных значений ID_Hall_G*/

UPDATE Halls H

SET H.ID_Hall=GEN_ID(ID_Hall_G,1);

/* Вставка в таблицу Расписание занятий"("Timetable") поля "Код помещения"("ID_Hall")*/

UPDATE Timetable T

SET T.ID_Hall=(SELECT H.ID_Hall FROM Halls H

WHERE H.Name=T.Hall);

END!!

SET TERM ; !!

/* Выполнить процедуру Hall_new*/

EXECUTE PROCEDURE Hall_new;

COMMIT WORK;

/* В строках исходной таблицы не должно быть NULL значений! */

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1

WHERE (RDB$FIELD_NAME = 'ID_HALL') AND

(RDB$RELATION_NAME = 'HALLS');

/* Добавляем ограничение первичного ключа для таблицы "Помещения" */

ALTER TABLE Halls ADD CONSTRAINT PK_Hall

PRIMARY KEY (ID_HALL);

/* Внешний ключ для таблицы "Расписание занятий" */

ALTER TABLE Timetable ADD CONSTRAINT FK_Hall FOREIGN KEY (ID_HALL) REFERENCES Halls(ID_HALL) ON UPDATE CASCADE;

/* Удаление процедуры Hall_new */

DROP PROCEDURE Hall_new;

/* Удаление поля "Помещения" из таблицы "Расписание занятий"*/

ALTER TABLE Timetable DROP Hall;

Проверим правильность работы модификации.

Исходная таблица "Расписание занятий" ("Timetable") до модификации имела вид, приведенный в таблице 18.

Таблица 18. Исходная таблица "Расписание занятий"

ID_TIMETABLE

ID_WORKER

ID_SERVICE

HALL

ID_WEEK

TIME_WORK

1

1

2

Большой

3

20.00

4

1

2

Большой

1

20.00

6

1

1

Большой

3

19.00

9

2

6

Тренажерный

1

20.00

10

6

4

Большой

2

19.00

11

6

4

Большой

4

19.00

После модификации появилась новая таблица "Помещения"("Halls"), приведенная в таблице 19.

Таблица 19. Новая таблица "Помещения"

ID_HALL

NAME

1

Большой

2

Тренажерный

При этом таблица "Расписание занятий" ("Timetable") модифицировалась в таблицу, приведенную в таблице 20.

Таблица 20. Модифицированная таблица "Расписание занятий"

ID_TIMETABLE

ID_WORKER

ID_SERVICE

ID_WEEK

TIME_WORK

ID_HALL

1

1

2

3

20.00

1

4

1

2

1

20.00

1

6

1

1

3

19.00

1

9

2

6

1

20.00

2

10

6

4

2

19.00

1

11

6

4

4

19.00

1

  1. Создание таблицы "Interval_Time" ("Интервалы планирования")

/*Создание таблицы "Интервалы планирования"("Interval_Time")*/

CREATE TABLE Interval_Time(

ID_ITime INTEGER,

Week VARCHAR(11),

Times VARCHAR(5));

/* Добавление в таблицу "Расписание занятий"("Timetable") поля "Код интервала планирования"("ID_ITime")*/

ALTER TABLE Timetable

ADD ID_ITime INTEGER NOT NULL;

/*Создание вспомогательного генератора для поля "Код интервала планирования"*/

CREATE GENERATOR ID_ITime_G;

SET GENERATOR ID_ITime_G TO 0;

/*Создание процедуры для переноса информации о рабочем времени из таблицы "Расписание занятий"("Timetable") в таблицу "Интервалы планирования"("Interval_Time")*/

SET TERM !! ;

CREATE PROCEDURE ITime_new

AS

BEGIN

/* Вставка в таблицу "Интервалы планирования"("Interval_Time") разных значений полей "Дни недели"("Week"), "Время"(Times)*/

INSERT INTO Interval_Time(Week, Times)

SELECT DISTINCT T.Week, T.Times

FROM (SELECT (SELECT Name FROM Weeks W

WHERE W.ID_Week=A.ID_Week),

Time_Work FROM Timetable A) AS T(Week, Times);

/* Вставка в таблицу "Интервалы панирования"("Interval_Time") поля "Код планирования" ("ID_ITime") (генератором ID_ITime_G)*/

UPDATE Interval_Time T SET

T.ID_ITime=GEN_ID(ID_ITime_G,1);

/* Вставка в таблицу "Расписание занятий"("Timetable") поля "Код планирования"("ID_ITime")*/

UPDATE Timetable T

SET T.Id_ITime=(SELECT IT.ID_ITime FROM Interval_Time IT

WHERE IT.Times=T.Time_Work AND

IT.Week=(SELECT W.Name FROM WeekS W

WHERE W.ID_Week=T.ID_Week));

END!!

SET TERM ; !!

/* Выполнить процедуру ITime_new*/

EXECUTE PROCEDURE ITime_new;

COMMIT WORK;

/* В строках исходной таблицы не должно быть NULL значений! */

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1

WHERE (RDB$FIELD_NAME = 'ID_ITIME') AND

(RDB$RELATION_NAME = 'INTERVAL_TIME');

/* Добавляем ограничение первичного ключа для таблицы "Интервалы планирования"("Interval_Time") */

ALTER TABLE Interval_Time ADD CONSTRAINT PK_ITime

PRIMARY KEY (ID_ITIME);

/* Внешний ключ для таблицы "Расписание занятий"("Timetable") */

ALTER TABLE Timetable ADD CONSTRAINT FK_ITime

FOREIGN KEY (ID_ITIME) REFERENCES Interval_Time(ID_ITIME)

ON UPDATE CASCADE;

/* Удаление процедуры ITime_new */

DROP PROCEDURE ITime_new;

/* Удаление ограничения на ссылку внешнего ключа из таблицы "Расписание занятий"("Timetable") на таблицу "Дни недели"("Weeks")*/

ALTER TABLE Timetable DROP CONSTRAINT Weeks_FK;

/*Отключение триггеров*/

ALTER TRIGGER TD_Weeks INACTIVE;

ALTER TRIGGER TU_Weeks INACTIVE;

/*Удаление таблицы "Дни недели"*/

DROP TABLE Weeks;

/*Удаление из таблицы "Расписание занятий" полей "Дни недели", "Время"*/

ALTER TABLE Timetable DROP ID_Week;

ALTER TABLE Timetable DROP Time_Work;

Проверим правильность работы модификации.

Исходная таблица "Расписание занятий" ("Timetable") до модификации имела вид, приведенный в таблице 21.

Таблица 21. Исходная таблица "Расписание занятий"

ID_TIMETABLE

ID_WORKER

ID_SERVICE

ID_WEEK

TIME_WORK

ID_HALL

1

1

2

3

20.00

1

4

1

2

1

20.00

1

6

1

1

3

19.00

1

9

2

6

1

20.00

2

10

6

4

2

19.00

1

11

6

4

4

19.00

1

Таблица "Дни недели"("Weeks") имела вид, приведенный в таблице 22.

Таблица 22. Исходная таблица "Дни недели"

ID_WEEK

NAME

1

Понедельник

2

Вторник

3

Среда

4

Четверг

5

Пятница

6

Суббота

7

Воскресенье

После модификации появилась новая таблица "Интервалы планирования"("Interval_Time") , приведенная в таблице 23.

Таблица 23. Новая таблица "Интервалы планирования"

ID_ITIME

WEEK

TIMES

1

Вторник

19.00

2

Понедельник

20.00

3

Среда

19.00

4

Среда

20.00

5

Четверг

19.00

При этом таблица "Расписание занятий" ("Timetable") модифицировалась в таблицу, приведенную в таблице 24.

Таблица 24. Модифицированная таблица "Расписание занятий"

ID_TIMETABLE

ID_WORKER

ID_SERVICE

ID_ITIME

ID_HALL

1

1

2

4

1

4

1

2

2

1

6

1

1

3

1

9

2

6

2

2

10

6

4

1

1

11

6

4

5

1

  1. Измение ключевого поля таблицы "Расписание занятий". Вместо поля "Код расписания занятий"("ID_Timetable") использовать поля "Код помещения"("ID_Hall") и "Код интервала планирования"("ID_ITime"). Мигрировать этот ключ в связанные таблицы "Журнал планирования" ("Register") и "Услуги клиента"("Services_Abonement").

/*Добавить в таблицу "Журнал посещений"("Register") поля "ID_ITime", "ID_Hall", которые заменят позже ключевое поле "ID_Timetable"*/

ALTER TABLE Register

ADD ID_ITime INTEGER NOT NULL,

ADD ID_Hall INTEGER NOT NULL;

/*Добавить в таблицу "Услуги клиента"("Services_Abonement") поля "ID_ITime", "ID_Hall", которые заменят позже ключевое поле "ID_Timetable"*/

ALTER TABLE Services_Abonement

ADD ID_ITime INTEGER NOT NULL,

ADD ID_Hall INTEGER NOT NULL;

/*Заполнить поля "ID_ITime", "ID_Hall" из таблицы "Расписание занятий"("Timetable") по ключевому полю "ID_Timetable"*/

UPDATE Register R

SET ID_Hall=(SELECT ID_Hall FROM Timetable T

WHERE T.ID_Timetable=R.ID_Timetable),

ID_ITime=(SELECT ID_ITime FROM Timetable TT

WHERE TT.ID_Timetable=R.ID_Timetable);

UPDATE Services_Abonement S

SET ID_Hall=(SELECT ID_Hall FROM Timetable T

WHERE T.ID_Timetable=S.ID_Timetable),

ID_ITime=(SELECT ID_ITime FROM Timetable TT

WHERE TT.ID_Timetable=S.ID_Timetable);

/*Удалить ссылки внешних ключей из таблицы "Расписание занятий"("Timetable") на таблицы "Услуги клиента"("Services_Abonement") и

"Журнал посещений"("Register")*/

ALTER TABLE Register DROP CONSTRAINT Timetable_reg_FK;

ALTER TABLE Services_Abonement DROP CONSTRAINT Timetable_ab_FK;

/*Удалить из таблиц ограничения первичного ключа*/

ALTER TABLE Register DROP CONSTRAINT xpkregister;

ALTER TABLE Services_Abonement DROP CONSTRAINT

xpkservices_abonement;

ALTER TABLE Timetable DROP CONSTRAINT xpktimetable;

/*Изменить значение первичного ключа */

ALTER TABLE Timetable ADD CONSTRAINT PK_Timetable

PRIMARY KEY (ID_ITime,ID_Hall);

ALTER TABLE Register ADD CONSTRAINT Register_PK

PRIMARY KEY (Date_Register,ID_Abonement,ID_Hall,ID_ITime);

ALTER TABLE Services_Abonement ADD CONSTRAINT

Services_Ab_PK

PRIMARY KEY (ID_Abonement,ID_Hall,ID_ITime);

/*Добавить ссылки внешних ключей из таблицы "Расписание занятий"("Timetable") на таблицы "Услуги клиента"("Services_Abonement") и

"Журнал посещений"("Register")*/

ALTER TABLE Register ADD CONSTRAINT FK_Timetable_R

FOREIGN KEY (ID_ITIME,ID_HALL) REFERENCES

Timetable(ID_ITIME,ID_HALL)

ON UPDATE CASCADE;

ALTER TABLE Services_Abonement ADD CONSTRAINT

FK_Timetable_A

FOREIGN KEY (ID_ITIME,ID_HALL) REFERENCES

Timetable(ID_ITIME,ID_HALL)

ON UPDATE CASCADE;

/*Изменение триггеров для таблицы "Timetable", связанных с полем "ID_Timetable"*/

SET TERM !! ;

/*Изменение триггера на удаление ON DELETE RESTRICT*/

ALTER TRIGGER TD_Timetable

AS

DECLARE VARIABLE numrows INTEGER;

BEGIN

/* Для талицы "Services_abonement"*/

select count(*) from Services_abonement

where Services_abonement.ID_Hall = OLD.ID_Hall AND

Services_abonement.ID_ITime = OLD.ID_ITime

into numrows;

IF (numrows > 0) THEN EXCEPTION

ERWIN_PARENT_DELETE_RESTRICT;

/* Для таблицы "Register"*/

select count(*) from Register

where Register.ID_Hall = OLD.ID_Hall AND

Register.ID_ITime = OLD.ID_ITime

into numrows;

IF (numrows > 0) THEN EXCEPTION ERWIN_PARENT_DELETE_RESTRICT;

END!!

/*Изменение триггера на обновление ON UPDATE RESTRICT*/

ALTER TRIGGER TU_TIMETABLE

AS

DECLARE VARIABLE numrows INTEGER;

BEGIN

/*Для таблицы "Services_abonement"*/

IF (OLD.ID_Hall <> NEW.ID_Hall AND OLD.ID_ITime<>

NEW.ID_ITime)

THEN

BEGIN

select count(*) from Services_abonement

where Services_abonement.ID_Hall = OLD.ID_Hall AND

Services_abonement.ID_ITime = OLD.ID_ITime

into numrows;

IF (numrows > 0) THEN EXCEPTION

ERWIN_PARENT_UPDATE_RESTRICT;

END

/* Для таблицы "Register"*/

IF (OLD.ID_Hall <> NEW.ID_Hall AND OLD.ID_ITime<>

NEW.ID_ITime)

THEN

BEGIN

select count(*) from Register

where Register.ID_Hall = OLD.ID_Hall AND

Register.ID_ITime = OLD.ID_ITime

into numrows;

IF (numrows > 0) THEN EXCEPTION

ERWIN_PARENT_UPDATE_RESTRICT;

END

END!!

SET TERM ; !!

/*Удалить из таблиц поле ID_Timetable"*/

ALTER TABLE Timetable DROP ID_Timetable;

ALTER TABLE Register DROP ID_Timetable;

ALTER TABLE Services_Abonement DROP ID_Timetable;

Проверим правильность работы модификации.

Исходная таблица "Расписание занятий" ("Timetable") до модификации имела вид, приведенный в таблице 25.

Таблица 25. Исходная таблица "Расписание занятий"

ID_TIMETABLE

ID_WORKER

ID_SERVICE

ID_ITIME

ID_HALL

1

1

2

4

1

4

1

2

2

1

6

1

1

3

1

9

2

6

2

2

10

6

4

1

1

11

6

4

5

1

Таблицы "Услуги клиента"("Services_Abonement") и "Журнал посещений"("Register") имели вид, приведенный в таблице 26 и в таблице 27.

Таблица 26. Исходная таблица "Услуги клиента"

ID_ABONEMENT

ID_TIMETABLE

NUMBER

1

1

1

1

4

4

1

6

1

2

4

4

3

10

2

3

11

2

4

10

4

6

9

4

6

10

2

Таблица 27. Исходная таблица "Журнал посещений"

DATE_REGISTER

ID_TIMETABLE

ID_ABONEMENT

03.11.2008

4

1

03.11.2008

4

2

04.11.2008

10

3

04.11.2008

10

4

04.11.2008

10

6

05.11.2008

1

1

05.11.2008

9

6

После модификации таблицы "Расписание занятий", "Услуги клиента", "Журнал посещений" имеют вид, приведенный в таблице 28, в таблице 29, в таблице 30.

Таблица 28. Модифицированная таблица "Расписание занятий"

ID_WORKER

ID_SERVICE

ID_ITIME

ID_HALL

6

4

1

1

1

2

2

1

2

6

2

2

1

1

3

1

1

2

4

1

6

4

5

1

Таблица 29. Модифицированная таблица "Услуги клиента"

ID_ITIME

ID_HALL

ID_ABONEMENT

NUMBER

2

1

1

4

3

1

1

1

4

1

1

1

2

1

2

4

1

1

3

2

5

1

3

2

1

1

4

4

1

1

6

2

2

2

6

4

Таблица 30. Модифицированная таблица ""Журнал посещений"

DATE_REGISTER

ID_ITIME

ID_HALL

ID_ABONEMENT

03.11.2008

2

1

1

03.11.2008

2

1

2

04.11.2008

1

1

3

04.11.2008

1

1

4

04.11.2008

1

1

6

05.11.2008

4

1

1

05.11.2008

2

2

6