
- •Введение
- •Анализ предметной области
- •Анализ сущностей и связей между ними
- •Составление требуемых запросов к базе данных
- •Анализ разрешений и запретов на операции с табличными данными для различных пользователей
- •Проектирование пользовательского интерфейса
- •Обработка данных
- •Заключение
- •Список литературы
- •Приложение 1 Листинг создания таблиц
- •Приложение 2 Листинг добавления данных в таблицы
Анализ разрешений и запретов на операции с табличными данными для различных пользователей
Были созданы 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 – Список пользователей и их привилегий после назначения
Проектирование пользовательского интерфейса
Все запросы были реализованы через вызовы хранимых процедур [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-го триггера