Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
задания практика 3 часть консоль БД MySQLпо ПР ТРЗБД_.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.64 Mб
Скачать

Практическая работа № 18

Тема: «Создание триггеров»

Цель работы: Научиться создавать триггеры.

Время выполнения: подготовка: 5 мин; выполнение: 120 мин; проверка: 10 мин; всего: 135 мин.

Указания к выполнению лабораторной работы

Триггер — это хранимая процедура, которая не вызывается непосредственно, а исполняется при наступлении определенного события ( вставка, удаление, обновление строки ).

Триггеры это особые процедуры которые срабатывают при изменении данных в таблицы операторами INSERT, UPDATE и DELETE.

Триггеры могут срабатывать как до BEFORE так и после AFTER изменения таблицы. Получается, что триггер может быть в 6 состояниях.

1 INSERT (BEFORE | AFTER)

2 UPDATE (BEFORE | AFTER)

3 DELETE (BEFORE | AFTER)

Добавление триггера

Задание. Необходимо при добавлении записи в табл user, пароль преобразовывать в хеш md5(), также имя и отчество преобразовывать в инициалы.

mysql> DELIMITER //

mysql> CREATE TRIGGER `test_user_pass` BEFORE INSERT ON `test`.`user`

    -> FOR EACH ROW

    -> BEGIN

    ->  SET NEW.name = LEFT(NEW.name,1);

    ->  SET NEW.otch = LEFT(NEW.otch,1);

    ->  SET NEW.pass = md5(NEW.pass);

    -> END//

mysql> DELIMITER;

Теперь вставляем туда запись

mysql> INSERT  INTO `user` SET `fam`='Нагайченко', `name`='Максим', `otch` = 'Валерьевич', `pass` = 'password', `login` = 'maxnag';

mysql> SELECT * FROM `user`;

| id | fam         | name | otch | pass                              | login  |

|  1 | Нагайченко  | M    | В     | 5f4dcc3b5aa765d61d8327deb882cf99 | maxnag |

Создать триггер на UPDATE таблицы, с таким же телом, чтобы пользователь не смог записать полное имя, отчество и пароль не в МД5();

Создание триггера на before update

mysql> DELIMITER //

mysql> CREATE TRIGGER `test_user_pass2` BEFORE UPDATE ON `test`.`user`

    -> FOR EACH ROW

    -> BEGIN

    ->  SET NEW.name = LEFT(NEW.name,1);

    ->  SET NEW.otch = LEFT(NEW.otch,1);

    ->  SET NEW.pass = md5(NEW.pass);

    -> END//

mysql> DELIMITER ;

Обновление записи

mysql> UPDATE `user` SET `fam`='Иванов', `name`='Иван', `otch` = 'Иванович', `pass` = 'пароль', `login` = 'ivan' WHERE id=1;

mysql> SELECT * FROM `user`;

| id | fam          | name | otch | pass                              | login  |

|  1 | Иванов      | И     | И    | e242f36f4f95f12966da8fa2efd59992 | ivan   |

NEW — для доступа к новым записям OLD — для доступа к старым записям

Напимер, если обновить фамилию, то новое значение доступно через NEW.fam, а к старому OLD.fam

Удаление триггера

Для удаления триггера используется, как обычно оператор DROP, пример

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;

где schema_name — название БД, trigger_name — название триггера

Список созданных триггеров

Показать триггер можно с помощью команды

SHOW TRIGGERS [{FROM | IN} db_name]

[LIKE 'pattern' | WHERE expr]

Задание 1

  1. Создать в СУБД MySQL таблицы:

CREATE TABLE `test` ( `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `content` TEXT NOT NULL ) ENGINE = MYISAM — лог CREATE TABLE `log` ( `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `msg` VARCHAR( 255 ) NOT NULL, `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `row_id` INT( 11 ) NOT NULL ) ENGINE = MYISAM — триггер DELIMITER | CREATE TRIGGER `update_test` AFTER INSERT ON `test` FOR EACH ROW BEGIN    INSERT INTO log Set msg = 'insert', row_id = NEW.id; END;* This source code was highlighted with Source Code Highlighter.

  1. Теперь добавьте запись в таблицу test. В таблице log тоже появится запись, обратите внимание на поле row_id, в нем хранится id вставленной вами строки.

  2. Удалите триггер

DROP TRIGGER `update_test`;

  1. Cоздайте еще одну таблицу, в которой будут храниться резервные копии строк из таблицы test.

CREATE TABLE `testing`.`backup` ( `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `row_id` INT( 11 ) UNSIGNED NOT NULL, `content` TEXT NOT NULL ) ENGINE = MYISAM

  1. Создайте два триггера

DELIMITER | CREATE TRIGGER `update_test` before update ON `test` FOR EACH ROW BEGIN   INSERT INTO backup Set row_id = OLD.id, content = OLD.content; END; CREATE TRIGGER `delete_test` before delete ON `test` FOR EACH ROW BEGIN   INSERT INTO backup Set row_id = OLD.id, content = OLD.content; END* This source code was highlighted with Source Code Highlighter.

Теперь если мы отредактируем или удалим строку из test она скопируется в backup.