Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6сем / курсовая_Жовтяк_4016.docx
Скачиваний:
6
Добавлен:
27.08.2024
Размер:
1.02 Mб
Скачать
  1. Анализ разрешений и запретов на операции с табличными данными для различных пользователей

Были созданы 4 пользователя: Директор (director), Администратор (admin), библиотекарь (librarian), библиограф (bibliograf). Создание пользователей представлено в листинге 12. Результат создания пользователей представлен на рисунке 12.

Листинг 12 – Создание пользователей

create user 'director' IDENTIFIED by 'director1';

create user 'admin' IDENTIFIED by 'admin1';

create user 'librarian' IDENTIFIED by 'librarian1';

create user 'bibliograf' IDENTIFIED by 'bibliograf1';

Рисунок 12 – Список пользователей и их привилегий

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

Листинг 13 – Назначение привилегий пользователям

grant select, update, delete, insert on *.* to 'admin1';

grant select, update, insert on *.* to 'librarian1';

grant select, update on *.* to 'bibliograf1';

grant select on *.* to 'director1';

flush PRIVILEGES;

SELECT User, Host, Select_priv, Update_priv, Delete_priv, Insert_priv

FROM mysql.user;

Рисунок 13 – Список пользователей и их привилегий после назначения

  1. Проектирование пользовательского интерфейса

Все запросы были реализованы через вызовы хранимых процедур [10].

Реализация процедуры по запросу 1 (вывода информации о читателе по ФИО) представлено в листинге 14. Пример вызовы процедуры на рисунках 14-15.

Листинг 14 – Реализация запроса 1 в процедуру pr1

delimiter //

create procedure pr1(i varchar(50))

begin

if (i not in (select readers.reader_FIO from my_library.readers)) then

SELECT 'Нет такого клиента';

else

SELECT * FROM my_library.readers

where reader_FIO = i;

end if;

end //

Рисунок 14 – Пример вызовы процедуры pr1 при параметре 'Тихонов Роман Данилович'

Рисунок 15 – Пример вызовы процедуры pr1 при параметре 'Аграновский'

Реализация процедуры по запросу 2 (выдача перечня читателя с определённой книгой) представлено в листинге 15. Пример вызова процедуры на рисунке 16.

Листинг 15 – Реализация запроса 2 в процедуру pr2

delimiter //

drop procedure pr2;

create procedure pr2 (i varchar(50))

begin

SELECT readers.reader_FIO

FROM my_library.readers, my_library.appeals, my_library.books

where books.title_book = i and

appeals.id_reader = readers.id_reader and

appeals.id_book = books.id_book;

end //

call pr2('Муму')

Рисунок 16 – Пример вызовы процедуры pr2

Реализация процедуры по запросу 3 (выдача перечня читателей, которым должны вернуть книгу в заданный день) представлено в листинге 16. Пример вызовы процедуры на рисунке 17.

Листинг 16 – Реализация запроса 3 в процедуру pr3

delimiter //

drop procedure pr3;

create procedure pr3 (i date)

begin

SELECT readers.reader_FIO, books.title_book

FROM my_library.readers, my_library.appeals, my_library.books

where appeals.return_day_expected = i and

appeals.id_reader = readers.id_reader and

appeals.id_book = books.id_book;

end //

call pr3('2022-10-28')

Рисунок 17 – Пример вызовы процедуры pr3

Реализация процедуры по запросу 4 (выдача результатов о выработке сотрудников) представлено в листинге 17. Пример вызовы процедуры на рисунке 18.

Листинг 17 – Реализация запроса 4 в процедуру pr4

delimiter //

create procedure pr4 ()

begin

SELECT employee.employee_FIO, COUNT(appeals.id_appeal)

FROM my_library.appeals, my_library.employee

WHERE appeals.id_employee = employee.id_employee

GROUP BY appeals.id_employee;

end //

call pr4

Рисунок 18 – Пример вызовы процедуры pr4

Реализация процедуры по запросу 5 (выдача «недобросовестных» читателей) представлено в листинге 18. Пример вызовы процедуры на рисунке 19.

Листинг 18 – Реализация запроса 5 в процедуру pr5

delimiter //

create procedure pr5 ()

begin

SELECT readers.reader_FIO, readers.telephone

FROM my_library.appeals, my_library.readers

WHERE appeals.id_reader = readers.id_reader

and appeals.return_day > appeals.return_day_expected

GROUP BY readers.reader_FIO;

end //

call pr5

Рисунок 19 – Пример вызовы процедуры pr5

Реализация процедуры по запросу 6 (выдача номера обращений, которые должны быть возвращены в определённый день) представлено в листинге 19. Пример вызовы процедуры на рисунке 20.

Листинг 19 – Реализация запроса 6 в процедуру pr6

delimiter //

drop procedure pr6;

create procedure pr6 (i int)

begin

SELECT id_appeal

FROM my_library.appeals

WHERE DAY(appeals.return_day_expected) = i;

end //

call pr6(20)

Рисунок 20 – Пример вызовы процедуры pr6

Реализация процедуры по запросу 7 (выдача имён людей и их телефонов, которые делали хотя бы одно обращение в библиотеку) представлено в листинге 20. Пример вызовы процедуры на рисунке 21.

Листинг 20 – Реализация запроса 7 в процедуру pr7

delimiter //

create procedure pr7 ()

begin

select DISTINCT readers.reader_FIO, readers.telephone

from my_library.appeals, my_library.readers

where appeals.id_reader = readers.id_reader

order by readers.reader_FIO;

end //

call pr7

Рисунок 21 – Пример вызовы процедуры pr7

Реализация процедуры по запросу 8 (выдача количества обращений каждого читателя в библиотеку) представлено в листинге 21. Пример вызовы процедуры на рисунке 22.

Листинг 21 – Реализация запроса 8 в процедуру pr8

delimiter //

create procedure pr8 ()

begin

SELECT DISTINCT readers.reader_FIO, COUNT(appeals.id_appeal)

FROM my_library.appeals, my_library.readers

WHERE appeals.id_reader = readers.id_reader

GROUP BY readers.reader_FIO;

end //

call pr8

Рисунок 22 – Пример вызовы процедуры pr8

Реализация процедуры по запросу 9 (выдача максимального депозита книги) представлено в листинге 22. Пример вызовы процедуры на рисунке 23.

Листинг 22 – Реализация запроса 9 в процедуру pr9

delimiter //

create procedure pr9 ()

begin

SELECT authors.author_FIO, MAX(books.deposit)

FROM my_library.authors, my_library.books

WHERE authors.id_author = books.id_author

GROUP BY authors.author_FIO;

end //

call pr9

Рисунок 23 – Пример вызовы процедуры pr9

Реализация процедуры по запросу 10 (выдача номеров обращений, стоимость которых выше заданной) представлено в листинге 23. Пример вызовы процедуры на рисунке 24.

Листинг 23 – Реализация запроса 10 в процедуру pr10

delimiter //

drop procedure pr10;

create procedure pr10 (i int)

begin

SELECT appeals.id_appeal, total

FROM my_library.appeals

WHERE appeals.total > i;

end //

call pr10(200)

Рисунок 24 – Пример вызовы процедуры pr10

Также составлена процедура для выдачи требуемых разрешений (привилегий) пользователям. Реализация процедуры представлено в листинге 24.

Листинг 24 – Процедура выдачи привилегий пользователям

delimiter //

create procedure pr_grant ()

begin

grant select, update, delete, insert on *.* to 'admin1';

grant select, update, insert on *.* to 'librarian1';

grant select, update on *.* to 'bibliograf1';

grant select on *.* to 'director1';

end //

Создается 1-й триггер с событием INSERT, который при создании новой записи в таблице Appeals задает статус обращения в новом столбце sale_status ‘Открыта заявка’. Реализация представлена в листинге 25. Результат выполнения представлен на рисунке 25.

Листинг 25 – Реализация 1-го триггера

CREATE DEFINER=`root`@`localhost` TRIGGER `appeals_BEFORE_INSERT` BEFORE INSERT ON `appeals` FOR EACH ROW begin

SET new.sale_status = 'Открыта заявка';

end

Рисунок 25 – Результат работы 1-го триггера

Создается 2-й триггер, который при любом обновлении таблицы appeals создает запись в новой созданной таблице data_change. Суть таблицы – отслеживать все изменения в основной таблице. Реализация представлена в листинге 26. Результат выполнения представлен на рисунке 26.

Листинг 26 – Реализация 2-го триггера

CREATE DEFINER=`root`@`localhost` TRIGGER `appeals_AFTER_UPDATE` AFTER UPDATE ON `appeals` FOR EACH ROW BEGIN

INSERT INTO data_change (data_name, data_change) VALUES ('UPDATE', sysdate());

END

Рисунок 26 – Результат работы 2-го триггера

Cоздается 3-й триггер, который при любом удалении записи из таблицы appeals создается запись в новой созданной таблице data_change, аналогично как делает триггер с событием UPDATE, только при этом ставится пометка об удалении DELETE. Реализация представлена в листинге 27. Результат выполнения представлен на рисунке 27.

Листинг 27 – Реализация 3-го триггера

CREATE DEFINER=`root`@`localhost` TRIGGER `appeals_AFTER_DELETE` AFTER DELETE ON `appeals` FOR EACH ROW BEGIN

INSERT INTO data_change (data_name, data_change) VALUES ('DELETE', sysdate());

END

Рисунок 27 – Результат работы 3-го триггера

Соседние файлы в папке 6сем