Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Готовые отчеты / Базы данных. Лабораторная работа 7

.pdf
Скачиваний:
41
Добавлен:
29.01.2021
Размер:
400.57 Кб
Скачать

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи

ЛАБОРАТОРНАЯ РАБОТА №7 по дисциплине «Базы данных»

на тему «Целостность данных, триггеры в MySQL»

Выполнили: студенты 3-го курса дневного отделения группы ИКПИ-85 Ежуров Антон Павлович

Коваленко Леонид Александрович Преподаватель:

ассистент кафедры ПИиВТ Овчинников Антон Олегович

Санкт-Петербург

2020

Цель работы Получить практические навыки в обеспечении целостности базы

данных MySQL с использованием триггеров. Ход работы

Создадим базу данных university в программе-дизайнере MySQL Workbench. В этой базе данных создадим таблицу users с полями:

1.id типа INT, первичный ключ (PK), счетчик (AI);

2.name типа VARCHAR, ненулевое (NN);

3.is_update типа BOOLEAN, ненулевое (NN), по умолчанию FALSE.

Для таблицы users создадим триггер (вкладка Triggers) (табл. 1). Таблица 1 — Триггер для таблицы users базы данных university

CREATE DEFINER = CURRENT_USER TRIGGER `university`.`users_AFTER_INSERT` AFTER INSERT ON `users` FOR EACH ROW

BEGIN

INSERT INTO results SET laboratory=false, examination=0, user_id=NEW.id;

END

В этой базе данных создадим таблицу results с полями:

1.id типа INT, первичный ключ (PK), счетчик (AI);

2.laboratory типа BOOLEAN, ненулевое (NN);

3.examination типа INT, ненулевое (NN);

4.user_id типа INT, ненулевое (NN).

Для таблицы results создадим внешний ключ (вкладка Foreign Keys) с именем user_id на таблицу university.users, с колонки user_id (таблицы results) на колонку id (таблицы users). В качестве события ON DELETE укажем CASCADE.

Для таблицы results создадим триггер (вкладка Triggers) (табл. 2). Таблица 2 — Триггер для таблицы results базы данных university

CREATE DEFINER = CURRENT_USER TRIGGER `university`.`results_AFTER_UPDATE` AFTER UPDATE ON `results` FOR EACH ROW

BEGIN

UPDATE users SET is_update=true WHERE id = NEW.user_id;

END

Сохраним созданную в программе-дизайнере схему базы данных на локальный компьютер.

2

Подключимся к базе данных MySQL (команда

Запустим генерацию базы данных на сервере MySQL (Пункт меню: Database → Forward Engineer). В опциях поставим галки напротив пунктов

Generate INSERT statements for tables и DROP objects before each CREATE object.

mysql -u root -p) и

активизируем базу данных university (команда use university).

В командной строке выполним следующие команды (рис. 1, 2, 3, 4):

INSERT INTO users VALUES (1,

'Иван', 0);

INSERT INTO users VALUES (2,

'Петр', 0);

INSERT INTO users VALUES (3,

'Егор', 0);

INSERT INTO users VALUES (4,

'Владимир', 0);

SELECT * FROM users;

 

SELECT * FROM results;

 

DELETE FROM users WHERE name

LIKE 'Иван';

DELETE FROM users WHERE name

LIKE 'Владимир';

SELECT * FROM users;

 

SELECT * FROM results;

 

UPDATE results SET laboratory=true, examination=5 WHERE user_id =

2;

SELECT * FROM results WHERE user_id = 2; SELECT * FROM users;

Рисунок 1 — Результат выполнения первой части команд

3

Рисунок 2 — Результат выполнения второй части команд

Рисунок 3 — Результат выполнения третьей части команд

Рисунок 4 — Результат выполнения четвертой части команд 4

Выводы

Внешний ключ SQL — это ключ, используемый для установления связи между таблицами. Иногда его также называют ссылочным ключом. Внешний ключ устанавливается для столбцов из зависимой, подчиненной таблицы, и указывает на один из столбцов из главной таблицы. Как правило, внешний ключ указывает на первичный ключ из связанной главной таблицы.

Поддержка внешних ключей также называется соблюдением ссылочной целостности (корректности значений внешних ключей). Реляционные СУБД поддерживают автоматический контроль ссылочной целостности. Любая операция, изменяющая данные в таблице, вызывает автоматическую проверку ссылочной целостности. При этом:

1.При операции добавления записи автоматически проверяется, ссылаются ли внешние ключи в этой записи на существующие записи в заявленных таблицах. Если выясняется, что операция приведёт к появлению некорректных ссылок, она не выполняется — система возвращает ошибку.

2.При операции редактирования записи:

1)Если изменяется её первичный ключ и на данную запись имеются ссылки, то операция редактирования завершается с ошибкой;

2)Если изменяется какой-то из внешних ключей, хранящихся в этой записи, и после изменения внешний ключ будет ссылаться на несуществующую запись, то операция редактирования завершается с ошибкой.

3. При операции удаления записи проверяется, нет ли на неё ссылок. Если ссылки имеются, то возможно три варианта дальнейших действий (фактически выполняемый зависит от СУБД и от выбора программиста, который он должен сделать при описании связи):

1)Запрет — удаление блокируется и возвращается ошибка.

2)Каскадное удаление — в одной транзакции производится удаление данной записи и всех записей, ссылающихся на данную. Если на удаляемые записи также есть ссылки и настройки также требуют удаления, то каскадное удаление продолжается дальше. Таким образом, после удаления данной

5

записи в базе не остаётся ни одной записи, прямо или косвенно ссылающейся на неё. Если хотя бы одну из ссылающихся записей удалить не получается (либо для неё настроен запрет, либо происходит какая-либо ещё ошибка), то все удаления запрещаются.

3) Присвоение NULL — во все внешние ключи записей, ссылающихся на данную, записывается маркер NULL. Если хотя бы для одной из ссылающихся записей это невозможно (например, если поле внешнего ключа описано как NOT NULL), то удаление запрещается.

Триггер (англ. trigger) — хранимая процедура особого типа, которая не вызывается непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT, удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определённом столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.

С помощью выражений ON DELETE и ON UPDATE можно установить действия, которые выполняются соответственно при удалении и изменении связанной строки из главной таблицы. В качестве действия могут использоваться следующие опции:

CASCADE: автоматически удаляет или изменяет строки из зависимой таблицы при удалении или изменении связанных строк в главной таблице.

SET NULL: при удалении или обновлении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение NULL. (В этом случае столбец внешнего ключа должен поддерживать установку NULL.)

RESTRICT (или NO ACTION): отклоняет удаление или изменение строк в главной таблице при наличии связанных строк в зависимой таблице.

6