LR7.Tyutterin_Yakov_Z1411-1
.pdfМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
канд. техн. наук, доц. |
|
Е. Л. Турнецкая |
должность, уч. степень, звание |
подпись, дата |
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7
Программная реализация триггеров
по дисциплине: Базы данных
РАБОТУ ВЫПОЛНИЛ |
|
|
|
|
|
СТУДЕНТ гр. № |
Z1411 |
|
|
Я. Н. Тюттерин |
|
|
|
|
|
|
|
|
номер группы |
подпись, дата |
|
инициалы, фамилия |
|
Студенческий билет № |
2022/4886 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Санкт-Петербург 2024
Лабораторная работа № 7. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ТРИГГЕРОВ.
Цели работы: Получение практических навыков по программной реализации триггеров на сервере MySQL.
Вариант 18. Занятость актеров театра. Работников театра можно подразделить на актеров, музыкантов, постановщиков и служащих. Каждая из перечисленных категорий имеет уникальные атрибуты-характеристики и может подразделяться (например, постановщики) на более мелкие категории. Театр возглавляет директор, в функции которого входят контроль за постановками спектаклей, утверждение pепеpтуаpа, принятие на работу новых служащих, приглашение актеров и постановщиков. Актеры, музыканты и постановщики, работающие в театре, могут уезжать на гастроли. Актеры театра могут иметь звания заслуженных и народных артистов, могут быть лауреатами конкурсов. Также актерами театра могут быть и студенты театральных училищ. Каждый актер имеет свои вокальные и внешние данные (пол, возраст, голос, pост и т.п.), которые могут подходить для каких-то pолей, а для каких-то нет (не всегда женщина может сыграть мужчину и наоборот). Для постановки любого спектакля необходимо подобрать актеров на роли и дублеров на каждую главную pоль. Естественно, что один и тот же актер не может играть более одной pоли в спектакле, но может играть несколько pолей в различных спектаклях. У спектакля также имеется pежисеp-постановщик, художник-постановщик, диpижеp- постановщик, автор. Спектакли можно подразделить по жанрам: музыкальная комедия, трагедия, оперетта и пр. С другой стороны, спектакли можно подразделить на детские, молодежные и пр. В pепеpтуаpе театра указывается какие спектакли, в какие дни и в какое время будут проходить, а также даты пpемьеp. В кассах театра можно заранее приобрести билеты или абонемент на любые спектакли. Абонемент обычно включает в себя билеты на спектакли либо конкретного автора, либо конкретного жанра. Цена билетов зависит от места, и спектакля. На премьеры билеты дороже. Администрацией театра фиксируется количество проданных билетов на каждый спектакль.
Рисунок 1 - Схема БД
В качестве триггера на вставку в таблицу со спектаклями будет использоваться тот, что будет вычислять значение даты окончания на основе времени старта и продолжительности в минутах. Но сначала потребуется модифицировать существующую таблицу со спектаклями и добавить столбец с датой окончания.
ALTER TABLE shows ADD COLUMN end_date timestamp;
Результат создания новой колонки:
Далее обновим значения для существующих событий:
update shows set end_date = `date` + INTERVAL duration MINUTE;
Результат выполнения запроса:
Результат создания триггера:
create trigger set_end_date_for_show before insert on shows for each row
begin
set new.end_date = new.date + INTERVAL new.duration MINUTE;
end;
Также сразу же введем ограничение NOT_NULL для этой колонки, чтобы точно убедиться, что триггер будет выполнен перед вставкой.
Произвели вставку тестовой записи:
INSERT INTO shows (title, date, duration, theatre_id)
VALUES ('Test', now(), 120, 1);
В результате получили:
Также для проверки корректности обновления даты спектакля произведем создание триггера, который не будет допускать спектакли с датой старта идущей после либо равно времени окончания.
create trigger check_date_end_and_date_update before update on shows for each row
BEGIN
IF (new.date > new.end_date OR (new.date + INTERVAL new.duration MINUTE) != new.end_date) THEN
SIGNAL SQLSTATE '45000'
SET
MESSAGE_TEXT = 'The start date of the performance cannot be equal to or after the end date';
END IF;
END
При передаче корректных значений:
При передаче некорректного значения:
Перед созданием триггера на удаление - введен новую таблицу, которая будут хранить информацию об операция удаления для таблицы shows. То есть она будет выступать в качестве журнала об операциях. Таким образом на уровне БД будут реализован аудит.
CREATE TABLE log (
id INT AUTO_INCREMENT PRIMARY KEY, date_log timestamp not null, operation varchar(10), description varchar(50),
value text
);
Результат создания триггера:
CREATE TRIGGER delete_show before DELETE on shows
FOR EACH ROW BEGIN
INSERT INTO log (date_log, operation, description, value) VALUES (now(), 'DELETE', 'Delete from shows', CONCAT(CAST(OLD.id AS CHAR), ', ', OLD.title));
END;
Результат удаления тестовой записи:
Просмотр таблицы с логами:
Просмотр списка триггеров:
Вывод
В результате проделанной работы был получен практический опыт создания триггеров для БД MySql. Триггеры в базе данных используются для выполнения различных задач, например для автоматической генерации значений виртуального поля, логгирования, сбора статистики, изменения данных в таблицах, если в DML-операции участвует представление, предотвращения DML-операций в определённые часы, реализации сложных ограничений целостности данных, организации различных видов аудита, оповещения других модулей о том, что делать в случае изменения информации в БД и т.д. Все это упрощает работу с БД и упрощает процесс сопровождения и поддержания актуальности данных. Также позитивно сказывается на производительности, так как при их отсутствии из клиентского приложения требовалось бы предварительно производить запросы, выполняющие определенные манипуляции с данными.
Список использованных источников:
1)https://metanit.com/sql/mysql/3.4.php
2)https://hmarketing.ru/blog/mysql/interval/
3)https://www.simmanchith.com/tutorial/sql/sql-not-null.aspx
4)https://stackoverflow.com/questions/12126991/cast-from-varchar-to-int-mysql
5)https://stackoverflow.com/questions/43689517/mysql-reference-current-row-in-delete-trigger
6)https://losst.pro/kak-dobavit-stolbets-v-tablitsu-mysql
7)https://dev.mysql.com/doc/refman/8.0/en/alter-table.html