
1 / 7
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Доцент, канд. техн. наук |
|
|
|
Е. Л. Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №7
Программная реализация триггеров
по курсу: Базы данных
СТУДЕНТКА ГР. № |
Z0411 |
|
14.05.23 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2023
Цель работы:
получение практических навыков по программной реализации триггеров на сервере MySQL.
Порядок выполнения работы
1. Реализуйте триггер, привязанный к событию INSERT (для вашей предметной области). Проверьте его работоспособность. Результат покажите на скриншоте.
2. Разработайте триггер, привязанный к событию UPDATE (для вашей предметной области). Проверьте его работоспособность. Результат покажите на скриншоте.
3. Создайте триггер, привязанный к событию DELETE (для вашей предметной области). Проверьте его работоспособность. Результат покажите на скриншоте.
4. Посмотрите список реализованных триггеров и сделайте скриншот.
5. Выполните отчет в соответствие с требованиями ГОСТ 7.32-2017 и ГОСТ 2.105-2019: по оформлению отчетов (https://guap.ru/standart/doc).
Вариант 8
Обслуживание рейсов в аэропорту
Аэропорт обслуживает рейсы разных авиакомпаний. У каждой авиакомпании есть несколько рейсов. Авиакомпании предоставляют самолеты различного типа (вместимости). Самолеты характеризуются типом, годом выпуска, количеством мест и фирмой-производителем. В один город могут быть несколько рейсов в разное время, осуществляемых различными авиакомпаниями. Самолеты обслуживаются экипажем: 27 командир корабля, второй пилот, штурман, бортинженер и стюардессы. О сотрудниках хранится следующая информация: Ф.И.О., должность, квалификация, экипаж. Рейс имеет свой номер, пункт отправления, пункт прибытия, время вылета, время в пути, тип самолета, название авиакомпании, обслуживающей данный рейс. Билет на самолет имеет свой номер и № рейса, ФИО пассажира, № места, стоимость, дата продажи, дата бронирования. Пассажир, приобретая билет на самолет, сообщает о себе паспортные данные. Клиент может забронировать билет по Интернету и выкупить его за 3 часа до вылета.
В данной лабораторной работе будет использована модель данных, спроектированная в прошлых работах (Рис. 1).
Рисунок 1 - Модель данных в среде MySQL Workbench
Триггеры – это объекты базы данных или хранимые программы, которые будут выполнены автоматически при наступлении определенного события, например модификации данных с помощью операторов INSERT, UPDATE или DELETE для связанной таблицы базы данных.
Создадим триггер, который автоматически подсчитывает разницу в днях между Датой бронирования и Датой приобретения в Таблице Билет.
Листинг триггера. Подсчет периода.
use аэропорт;
drop trigger if exists check_duration;
delimiter //
create trigger check_duration before insert on билет for
each row
begin
set new.`Разница` = ABS(DATEDIFF(new.`Дата приобретения`, new.`Дата бронирования`));
end
//
Рисунок 2 - Результат периода
В таблице Билет создадим триггер на обновление данных для проверки корректности Даты бронирования и Даты продажи.
Листинг триггера. Проверка даты.
use аэропорт;
drop trigger if exists check_date;
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 //
Тестирование правильности.
update `билет` set `Дата бронирования` = '2023-01-01'
where `№ Билет` = 11;
Рисунок 3 - Расшифровка отчета об отказе выполнения операции обновления
Создадим триггер для удаления записи в таблице Скидка.
Для этого создадим таблицу Лог.
CREATE TABLE `лог` (id_log INT AUTO_INCREMENT PRIMARY KEY,
date_log date,
operation char(10),
description text)
Листинг триггера.
use `аэропорт`;
drop trigger if exists number_rr;
delimiter $$
create trigger number_rr before delete on `скидка`
for each row
begin
insert into `лог` (date_log,operation,description) VALUES
(curdate(),'delete','Удаление из таблицы скидка');
end $$
delimiter ;
Результат выполнения.
delete from скидка where `№ Билет` = 9;
select * from аэропорт.`лог`;
Рисунок 4 - Результат заполнения таблицы log
Вывод
В ходе выполнения данной лабораторной работы были изучены возможности триггеров, на сервере были реализованы триггеры, которые могут пригодиться при работе в этой предметной области – Аэропорт, например, триггер на расчёт количества дней между датами бронирования и приобретения, и триггеры (на обновление и на удаление), которые обновляют информацию о корректности ввода дат, а также выводят сообщение об ошибке и удаления данных в таблице Скидка.
Созданные триггеры были протестированы и срабатывают корректно.
Проблемы возникли с триггером DELETE, для его корректной работы в итоге была выбрана таблица без связей, в других случая возникала Ошибка 1442(про которую написано в интернет ресурсах, что она не новая и все о ней знают).