- •Содержание
- •Введение
- •Анализ разрешений и запретов на операции с табличными данными для различных пользователей.
- •1 Системный анализ предметной области
- •1.2 Описание предметной области
- •1.2 Описание входных документов для заполнения бд
- •1.3 Определение пользователей
- •1.4 Определение запросов
- •1.5 Определение выходных документов
- •Анализ сущностей и связей между ними: er–диаграмма
- •Нормализация отношений: схема бд
- •Запросы
- •5 Анализ разрешений и запретов на операции с табличными данными для различных пользователей
- •6 Проектирование пользовательского интерфейса
- •6.1 Реализация всех запросов через вызовы хранимых процедур
- •6.2 Хранимые процедуры для выдачи требуемых разрешений каждому пользователю
- •6.3 Триггеры для работы пользователей с таблицами базы данных
- •7 Обработка и визуализация данных
- •7.1 Обработка и визуализация данных инструментами языка программирования Python
- •7.2 Визуализация данных программными инструментами Excel
- •Заключение
- •Список использованных источников
- •Приложение а Листинг создания таблиц
- •Приложение б Листинг добавление данных в таблицы
- •Приложение в Скриншоты заполненных таблиц в бд
6.2 Хранимые процедуры для выдачи требуемых разрешений каждому пользователю
Были составлены процедуры для выдачи требуемых разрешений (привилегий) пользователям.
Реализация выдачи привилегий для пользователя Администратор БД (adminbd) в процедуру представлена в листинге 23.
Листинг 23 – Процедура выдачи привилегий для пользователя Администратор (adminbd)
DELIMITER //
create procedure grant_priv_to_adminbd()
BEGIN
grant all privileges on *.* to 'Adminbd';
END //
DELIMITER ;
Реализация выдачи привилегий для пользователя Менеджер обслуживания рейсов (mor) в процедуру представлена в листинге 24.
Листинг 24 – Процедура выдачи привилегий для пользователя Менеджер обслуживания рейсов (mor)
DELIMITER //
CREATE PROCEDURE grant_privileges_to_mor()
BEGIN
GRANT SELECT ON `рейс` TO 'mor';
GRANT SELECT ON `билет` TO 'mor';
GRANT SELECT ON `самолет` TO 'mor';
GRANT UPDATE ON `авиакомпания` TO 'mor';
END //
DELIMITER ;
Реализация выдачи привилегий для пользователя Кассир (cashier) в процедуру представлена в листинге 25.
Листинг 25 – Процедура выдачи привилегий для пользователя Кассир (cashier)
DELIMITER //
CREATE PROCEDURE grant_privileges_to_cashier()
BEGIN
GRANT SELECT ON `билет` TO 'cashier';
GRANT SELECT ON `авиакомпания` TO 'cashier';
GRANT SELECT ON `рейс` TO 'cashier';
GRANT UPDATE ON `билет` TO 'cashier';
GRANT INSERT ON `билет` TO 'cashier';
END //
DELIMITER ;
6.3 Триггеры для работы пользователей с таблицами базы данных
Были разработаны триггеры для работы пользователей с таблицами базы данных:
Для таблицы "Сотрудники" был создан триггер, представленный в листинге 26. Он проверяет, является ли атрибут "Должность" одной из разрешенных должностей (Командир, Второй пилот, Штурман, Бортинженер, Стюардесса) перед вставкой или обновлением новой записи сотрудника. Если введенная должность не является одной из допустимых, триггер выдаст ошибку с сообщением "Такой должности не существует". Результат работы триггера представлен на рисунке 24.
Листинг 26 – Триггер на проверку должности при обновлении или добавлении
DELIMITER //
CREATE TRIGGER check_employee_position_insert
BEFORE INSERT ON сотрудники
FOR EACH ROW
BEGIN
IF NEW.Должность NOT IN ('Командир', 'Второй пилот', 'Штурман', 'Бортинженер', 'Стюардесса') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Такой должности не существует';
END IF;
END//
DELIMITER ;
CREATE TRIGGER check_employee_position_update
BEFORE UPDATE ON сотрудники
FOR EACH ROW
BEGIN
IF NEW.Должность NOT IN ('Командир', 'Второй пилот', 'Штурман', 'Бортинженер', 'Стюардесса') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Такой должности не существует';
END IF;
END//
DELIMITER ;
Рисунок 194 – Вывод сообщения об ошибке
Для таблицы "Пассажиры" был создан триггер, представленный на листинге 27. При добавлении данных он проверяет правильное ли количество символов введено в атрибут "Паспортные данные". Если введенное количество символов некорректно, триггер выдаст ошибку с сообщением "Ошибка неверное значение паспортных данных". Результат работы триггера представлен на рисунке 25.
Листинг 27 – Триггер на проверку паспортных данных при обновлении или добавлении
DELIMITER //
CREATE TRIGGER check_passport_length_insert
BEFORE INSERT ON пассажиры
FOR EACH ROW
BEGIN
DECLARE passport_length INT;
SET passport_length = LENGTH(NEW.`Паспортные данные`);
IF passport_length != 10 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ошибка неверное значение паспортных данных';
END IF;
END//
DELIMITER ;
Рисунок 205 – Вывод сообщения об ошибке
Для таблицы "Билет" был создан триггер на проверку корректности ввода и обновления "Даты бронирования", представленный на листинге 28. При добавлении или обновлении данных он проверяет дату бронирования по дате приобретения так как дата бронирования не может быть позже даты приобретения, если дата бронирования позже даты приобретения триггер выдаст сообщение об ошибке "'Дата бронирования не может быть позже даты
приобретения ". Результат работы триггера представлен на рисунке 26.
Листинг 28 – Триггер на проверку даты бронирования при обновлении или добавлении
delimiter //
create trigger check_date before update on `билет`
for each row
BEGIN
IF new.`Дата бронирования` > new.`Дата приобретения` THEN
SIGNAL SQLSTATE '45000'
SET
MESSAGE_TEXT = 'Дата бронирования не может быть позже даты
приобретения';
END IF;
END //
Рисунок 216 – Вывод сообщения об ошибке
Для таблицы "Экипаж" был создан триггер на подсчет количества сотрудников в данном экипаже. Данный триггер создает столбец "количество_сотрудников", анализирует данные из таблицы "сотрудники" и заполняет столбец "количество_сотрудников" после добавления новых записей, листинг триггера 29, листинг добавления новой записи 30. Результат работы триггера представлен на рисунке 27.
Листинг 29 – Триггер update_crew_employee_count
DELIMITER //
CREATE TRIGGER update_crew_employee_count
AFTER INSERT ON сотрудники
FOR EACH ROW
BEGIN
DECLARE crew_id INT;
DECLARE employee_count INT;
SET crew_id = NEW.`№ Экипажа`;
SELECT COUNT(*) INTO employee_count FROM сотрудники WHERE `№ Экипажа` = crew_id;
UPDATE экипаж SET количество_сотрудников = employee_count WHERE `№ Экипажа` = crew_id;
END//
DELIMITER ;
Листинг 30 – Добавление новой записи в таблицу Сотрудники
INSERT INTO сотрудники (`Ф.И.О.`, `Должность`, `Квалификация`, `№ Экипажа`)
VALUES ('Ерошкевич Максим Сергеевич', 'Командир', 'Высокая', 3);
Рисунок 227 – Результат выполнения триггера update_crew_employee_count
Для выполнения триггера на удаление необходимо создать таблицу "удаленные". Данный триггер при удалении определенного сотрудника помещает информацию о удалении в таблицу "удаленные", листинг создания таблицы удаленные 31, листинг создания триггера 32. Результаты работы триггера представлены на рисунке 28 и на рисунке 29.
Листинг 31 – Создание таблицы Удаленные
CREATE TABLE `удаленные` (id_del INT AUTO_INCREMENT PRIMARY KEY,
date_del date,
operation char(10),
description text)
Листинг 32 – Триггер delite
delimiter //
create trigger delite before delete on `сотрудники`
for each row
begin
insert into `удаленные` (date_del,operation,description) VALUES
(curdate(),'delete','Удаленные сотрудники');
end //
delimiter ;
Рисунок 238 – Результат выполнения триггера delite
Рисунок 249 – Результат выполнения триггера delite
В итоге было создано 5 триггеров, привязанных к событиям INSERT, UPDATE, DELITE, а также проверена их работоспособность, посмотрим список триггеров на рисунке 30.
Рисунок 30 – Вывод списка триггеров
