
- •Министерство образования и науки рф
- •Рязанский государственный радиотехнический университет
- •Разработка программ по сопровождению базы данных ис автоматизации деятельности фитнес клуба
- •Описание предметной области
- •Описание структуры базы данных
- •4. Скрипт по созданию модифицированной бд
- •5 . Скрипт по созданию триггеров
- •6. Скрипт по созданию хранимых процедур
- •7. Скрипт по созданию ролей и присвоению им прав
- •Список используемых источников
7. Скрипт по созданию ролей и присвоению им прав
Анализируя предметную область, выделим несколько пользователей:
администратор фитнес клуба, который должен иметь всю информацию для оформления абонементов и ведения учета клиентов, а так же права доступа для внесения данных по клиентам (пользователь ADMINISTRATOR);
инструктор фитнес клуба, который проводит занятия и имеет доступ к данным по проведению занятий (пользователь INSTRUCTOR);
гость, который имеет доступ к ограниченному числу таблиц с целью их ознакомления (пользователь GUEST).
Для каждого из пользователей создаем набор прав на доступ к объектам БД. Политику безопасности на доступ к объектам реализуем с использованием механизма SQL ролей:
/*Создание ролей*/
CREATE ROLE Administrator_role;
CREATE ROLE Instructor_role;
CREATE ROLE Guest_role;
/*Разделение прав ролей между пользователями*/
GRANT Administrator_role TO ADMINISTRATOR;
GRANT Instructor_role TO INSTRUCTOR;
GRANT Guest_role TO GUEST;
/*Наделение правами Administrator_role*/
/*Право пользоваться всеми операциями над таблицей "Клиенты"*/
GRANT ALL ON Clients TO Administrator_role;
/*Право пользоваться всеми операциями над таблицей "Абонементы"*/
GRANT ALL ON Abonements TO Administrator_role;
/*Право пользоваться всеми операциями над таблицей "Услуги клиента"*/
GRANT ALL ON Services_Abonement TO Administrator_role;
/*Право пользоваться всеми операциями над таблицей "Журналы посещений"*/
GRANT ALL ON Register TO Administrator_role;
/*Право пользоваться всеми операциями над таблицей "Скидки"*/
GRANT ALL ON Discounts TO Administrator_role;
/*Право пользоваться чтением таблицы "Помещения"*/
GRANT SELECT ON Halls TO Administrator_role;
/*Право пользоваться чтением таблицы "Интервалы планирования"*/
GRANT SELECT ON Interval_Time TO Administrator_role;
/*Право пользоваться чтением таблицы "Прейскурант"*/
GRANT SELECT ON Price_List TO Administrator_role;
/*Право пользоваться чтением таблицы "Услуги"*/
GRANT SELECT ON Services TO Administrator_role;
/*Право пользоваться чтением таблицы "Сотрудники"*/
GRANT SELECT ON Workers TO Administrator_role;
/*Право пользоваться чтением таблицы "Должности"*/
GRANT SELECT ON Jobs TO Administrator_role;
/*Право пользоваться чтением таблицы "Расписание занятий"*/
GRANT SELECT ON Timetable TO Administrator_role;
/*Право выполнять процедуру "Hallp", выводящую информации о расписании
занятий для каждого помещения за определенный период*/
GRANT EXECUTE ON PROCEDURE Hallp TO Administrator_role;
/*Наделение правами Instructor_role*/
/*Право пользоваться всеми операциями над таблицей "Прейскурант"*/
GRANT ALL ON Price_List TO Instructor_role;
/*Право пользоваться всеми операциями над таблицей "Расписание занятий"*/
GRANT ALL ON Timetable TO Instructor_role;
/*Право пользоваться чтением таблицы "Помещения"*/
GRANT SELECT ON Halls TO Instructor_role;
/*Право пользоваться всеми операциями над таблицей "Интервалы планирования"*/
GRANT ALL ON Interval_Time TO Instructor_role;
/*Право выполнять процедуру "Registerp", подсчитывающую для каждого сотрудника
количество занятий, количесвто клиентов и общую сумму, полученную от клиентов
за определенный период времени*/
GRANT EXECUTE ON PROCEDURE Registerp TO Instructor_role;
/*Наделение правами Guest_role*/
/*Право пользоваться чтением таблицы "Прейскурант"*/
GRANT SELECT ON Price_List TO Guest_role;
/*Право пользоваться чтением таблицы "Услуги"*/
GRANT SELECT ON Services TO Guest_role;
/*Право пользоваться чтением таблицы "Расписание занятий"*/
GRANT SELECT ON Timetable TO Guest_role;
/*Право пользоваться чтением таблицы "Помещения"*/
GRANT SELECT ON Halls TO Guest_role;
/*Право пользоваться чтением таблицы "Интервалы планирования"*/
GRANT SELECT ON Interval_Time TO Guest_role;
Контрольный пример
Перечень таблиц с модифицированными данными расположен в Приложении.
Приведем пример на выборку данных.
Из таблицы “Абонементы”(“Abonements”) выведем код абонемента, дату начала действия абонемента, дату окончания действия абонемента, величину скидки и окончательную сумму абонемента, относящиеся к клиенту Ильина Е.В.
Запрос будет выглядеть так:
select A.id_abonement, A.date_start, A.date_finish, (select D.discount from
Discounts D where D.id_discount=A.id_discount)||'%' as discount, A.final_summa
from Abonements A
where A.id_client=(select C.id_client from Clients C where C.fio='Ильина Е.В.');
Результат выполнения запроса получим:
ID_ABONEMENT |
DATE_START |
DATE_FINISH |
DISCOUNT |
FINAL_SUMMA |
1 |
01.11.2008 |
01.12.2008 |
5% |
570,000 |
5 |
01.10.2008 |
01.11.2008 |
5% |
342,000 |
2) Проверим правильность работы триггера, который автоматически вычисляет поля “Первоначальная сумма”(”First_Summa”) и “Окончательная сумма”( ”Final_summa”) в таблице “Абонементы“ (“Abonements “) при добавлении, изменении и удалении в таблице “Услуги клиента”(“Services_Abonement“).
В таблицу “Услуги клиента”(“Services_Abonement“)добавим несколько записей для абонемента с кодом 2:
ID_ABONEMENT |
ID_ITIME |
ID_HALL |
NUMBER |
2 |
3 |
1 |
1 |
2 |
4 |
1 |
2 |
Для выбора записей из таблицы “Услуги клиента” для кода абонемента 2 напишем запрос, который выводит количество занятий и цену занятий (цена занятий находится путем выбора сначала из таблицы “Расписание занятий” кода услуги и кода инструктора, по которым из таблицы “Прейскурант” находится цена):
select S.number, (SELECT P.price FROM price_list P
WHERE P.id_worker=(SELECT T.id_worker FROM timetable T
WHERE T.id_hall=S.id_hall AND
T.id_itime=S.id_itime)
AND
P.id_service=(SELECT W.id_service FROM timetable W
WHERE W.id_hall=S.id_hall AND
W.id_itime=S.id_itime))
FROM services_abonement S
WHERE S.id_abonement='2'
Результат запроса получим:
NUMBER |
PRICE |
1 |
100,000 |
2 |
100,000 |
4 |
100,000 |
Далее количество и цена перемножаются и все суммируется. Результат записывается в поле “First_Summa”. Для данного примера это значение равно 700. Далее из таблицы “Система скидок” извлекается значение скидки по коду скидки, который хранится в абонементе. Для данного примера код скидки 3, а величина скидки – 5%. Умножаем значение скидки на начальную сумму “First_Summa”, делим на 100 и вычитаем это значение из начальной суммы. Результат запишем в поле ”Final_summa”. Для данного выражение это значение 700-700*0,05=665.
В результате выполнения процедуры получим измененную запись в таблице “Абонементы”:
ID_ABONEMENT |
ID_CLIENT |
DATE_START |
DATE_FINISH |
FIRST_SUMMA |
ID_DISCOUNT |
FINAL_SUMMA |
ID_WORKER |
2 |
2 |
15.11.2008 |
15.12.2008 |
700,000 |
3 |
665,000 |
3 |
Проверим действие данного триггера на удаление записи из таблицы “Услуги клиента”. Удалим из нее запись:
ID_ABONEMENT |
ID_ITIME |
ID_HALL |
NUMBER |
1 |
2 |
1 |
4 |
В результате выполнения процедуры получим измененную запись в таблице “Абонементы”:
ID_ABONEMENT |
ID_CLIENT |
DATE_START |
DATE_FINISH |
FIRST_SUMMA |
ID_DISCOUNT |
FINAL_SUMMA |
ID_WORKER |
1 |
1 |
01.11.2008 |
01.12.2008 |
200,000 |
1 |
190,000 |
3 |
Проверим действие данного триггера на изменение записи из таблицы “Услуги клиента”. Изменим запись:
ID_ABONEMENT |
ID_ITIME |
ID_HALL |
NUMBER |
5 |
5 |
1 |
1 |
Поставим новое значение Number=10.
В результате выполнения процедуры получим измененную запись в таблице “Абонементы”:
ID_ABONEMENT |
ID_CLIENT |
DATE_START |
DATE_FINISH |
FIRST_SUMMA |
ID_DISCOUNT |
FINAL_SUMMA |
ID_WORKER |
5 |
1 |
01.10.2008 |
01.11.2008 |
1440,000 |
1 |
1368,000 |
3 |
3) Проверим работу триггера, проверяющий то, что в таблице “Прейскурант”(“Price_list“) должны присутствовать только те сотрудники, которые могут проводить занятия.
Предпринимается попытка в таблицу “Прейскурант” вставить сотрудника с кодом 4. Вызывается созданное исключение о невозможности вставки.
Рисунок 5. Вызов исключения о невозможности вставки сотрудника
4) Проверим правильность работы хранимой процедуры, которая за заданный период времени выводит список сотрудников-инструкторов с указанием количества часов проведенных занятий, общей суммы средств, полученных от клиентов, и количества клиентов, посетивших их занятия.
Для наглядности напишем запрос для проверки результата, позволяющий отобразить таблицу “Журнал посещений” с внесением данных о коде услуги, о коде инструктора, о цене 1 занятия и скидки абонемента:
select r.date_register, r.id_abonement,
(select t.id_worker from timetable t where t.id_hall=r.id_hall and
t.id_itime=r.id_itime),
(select t.id_service from timetable t where t.id_hall=r.id_hall and
t.id_itime=r.id_itime),
p.price, (select d.discount from Discounts d where
d.id_discount=a.id_discount)||'%' as discount
from register r, abonements a, price_list p
where a.id_abonement=r.id_abonement and
p.id_worker=(select t.id_worker from timetable t where t.id_hall=r.id_hall
and t.id_itime=r.id_itime) and
p.id_service=(select t.id_service from timetable t where t.id_hall=r.id_hall
and t.id_itime=r.id_itime);
Результат запроса:
DATE_REGISTER |
ID_ABONEMENT |
ID_WORKER |
ID_SERVICE |
PRICE |
DISCOUNT |
03.11.2008 |
1 |
1 |
2 |
100,000 |
5% |
03.11.2008 |
6 |
2 |
6 |
80,000 |
|
04.11.2008 |
6 |
6 |
4 |
120,000 |
|
04.11.2008 |
3 |
6 |
4 |
120,000 |
5% |
04.11.2008 |
4 |
6 |
4 |
120,000 |
20% |
05.11.2008 |
1 |
1 |
1 |
100,000 |
5% |
05.11.2008 |
2 |
1 |
1 |
100,000 |
5% |
06.11.2008 |
3 |
6 |
4 |
120,000 |
5% |
Вызовем процедуру с заданным временным отрезком:
select * from RegisterP('04.11.2008','06.11.2008')
В результате выполнения процедуры получим следующие значения:
OUT_FIO |
KOL |
SUMA |
KOL_CHEL |
Николаева Ж.П. |
1 |
190,000 |
2 |
Карпов А.Т. |
0 |
0,000 |
0 |
Зубаревич Ю.И. |
0 |
0,000 |
0 |
Сомина Л.О. |
2 |
420,000 |
4 |
Одина О.В. |
0 |
0,000 |
0 |
5) Проверим правильность работы хранимой процедуры, которая для заданного помещения за заданный период времени формирует расписание проводимых занятий с указанием ФИО сотрудника-инструктора, его должность, наименование оказанной услуги.
Для наглядности напишем запрос для проверки результата, позволяющий отобразить таблицу “Расписание занятий” в полном ее виде для помещения “Большой” зал:
select (SELECT W.fio FROM workers W WHERE W.id_worker=S.id_worker),
(select J.name FROM jobs J WHERE J.id_job=
(SELECT G.id_job FROM WORKERS G WHERE
G.id_worker=S.id_worker)),
(SELECT Z.name from services Z WHERE
Z.id_service=S.id_service),
(SELECT O.week from interval_time O WHERE
O.id_itime=S.id_itime),
(SELECT O.times from interval_time O WHERE
O.id_itime=S.id_itime)
FROM timetable S WHERE S.id_hall=(SELECT H.id_hall FROM
HALLS H WHERE H.name='Большой');
Результат выполнения запроса:
FIO |
NAME |
NAME1 |
WEEK |
TIMES |
Николаева Ж.П. |
Инструктор |
Калланетика |
Среда |
20.00 |
Николаева Ж.П. |
Инструктор |
Калланетика |
Понедельник |
20.00 |
Николаева Ж.П. |
Инструктор |
Йога |
Среда |
19.00 |
Сомина Л.О. |
Инструктор |
Аэробика |
Вторник |
19.00 |
Сомина Л.О. |
Инструктор |
Аэробика |
Четверг |
19.00 |
Одина О.В. |
Инструктор |
Танец живота |
Суббота |
20.00 |
Теперь вызовем процедуру с наименованием помещения “Большой зал” и для периода от '05.11.2008'(среда) до '10.11.2008'(понедельник):
select * from HallP('Большой','05.11.2008','10.11.2008')
В результате выполнения процедуры получим следующие значения:
DATA |
WORKER |
JOB |
SERVICE |
WEEK |
TIMES |
05.11.2008 |
Николаева Ж.П. |
Инструктор |
Йога |
Среда |
19.00 |
05.11.2008 |
Николаева Ж.П. |
Инструктор |
Калланетика |
Среда |
20.00 |
06.11.2008 |
Сомина Л.О. |
Инструктор |
Аэробика |
Четверг |
19.00 |
08.11.2008 |
Одина О.В. |
Инструктор |
Танец живота |
Суббота |
20.00 |
10.11.2008 |
Николаева Ж.П. |
Инструктор |
Калланетика |
Понедельник |
20.00 |
6) Проверим правильность организации доступа к информации. Для этого создадим с помощью IBExpert пользователя GUEST.
Попытаемся получить доступ к таблице «Сотрудники», доступ к которой запрещен данному пользователю. В результате появляется окно (рисунок 6) говорящее о невозможности доступа.
Рисунок 6.Невозможен доступ к данной таблице
Заключение
В курсовой работе были разработаны программы по сопровождению базы данных ИС «Деятельность фитнес клуба».
Были разработаны триггеры ссылочной целостности, созданы хранимые процедуры, распределены права между пользователями, произведена модификация, улучшающая хранение данных в БД.