Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 / курсовая.docx
Скачиваний:
7
Добавлен:
16.05.2025
Размер:
2.22 Mб
Скачать

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 – Вывод списка триггеров

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