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

7. Скрипт по созданию ролей и присвоению им прав

Анализируя предметную область, выделим несколько пользователей:

  1. администратор фитнес клуба, который должен иметь всю информацию для оформления абонементов и ведения учета клиентов, а так же права доступа для внесения данных по клиентам (пользователь ADMINISTRATOR);

  2. инструктор фитнес клуба, который проводит занятия и имеет доступ к данным по проведению занятий (пользователь INSTRUCTOR);

  3. гость, который имеет доступ к ограниченному числу таблиц с целью их ознакомления (пользователь 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;

Контрольный пример

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

  1. Приведем пример на выборку данных.

Из таблицы “Абонементы”(“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.Невозможен доступ к данной таблице

Заключение

В курсовой работе были разработаны программы по сопровождению базы данных ИС «Деятельность фитнес клуба».

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