- •Общие указания к выполнению практических работ
- •Критерии оценки:
- •Практическая работа № 1
- •Указания по выполнению практической работы Возможности монитора MySql
- •Задание 1
- •Описание учебного примера
- •Удаление таблиц
- •Задание 1
- •Контрольные вопросы
- •Практическая работа №2
- •Указания по выполнению практической работы Команда alter table
- •Задание 1
- •Задание 2
- •Контрольные вопросы
- •Практическая работа № 3
- •Указания по выполнению практической работы
- •Задание 1
- •Задание 1
- •Задание 2
- •1. Создание eer-диаграммы
- •Контрольные вопросы
- •Лабораторная работа № 7
- •Указания по выполнению лабораторной работы
- •Для компонента adoConnection1 устанавливаем следующие свойства
- •Простая выборка
- •Использование вычисляемых полей
- •Логические связки and и or
- •Выборка с упорядочением
- •Контрольные вопросы
- •Практическая работа № 11
- •Указания к выполнению лабораторной работы Запросы к нескольким таблицам
- •Задание1
- •Табличный подзапрос
- •Использование операций in и not in
- •Использование операций some, any и all
- •Использование exists и not exists
- •Задание
- •Контрольные вопросы
- •Лабораторная работа № 14
- •Команда insert
- •Задание 1
- •Команда update
- •Задание 2
- •Команда delete
- •Задание 3
- •Контрольные вопросы
- •Лабораторная работа № 15
- •Задание
- •Задание 2
- •Контрольные вопросы
- •Лабораторная работа № 16
- •Контрольные вопросы
- •Практическая работа № 17
- •Задание 1
- •Задание 2
- •Контрольные вопросы
- •Практическая работа № 18
- •Добавление триггера
- •Создание триггера на before update
- •Удаление триггера
- •Список созданных триггеров
- •Задание 1
- •Задание 2
- •Задание 3
- •Задание 4
- •Контрольные вопросы
- •Лабораторная работа № 19
- •Задание 1
- •Задание 2
- •Контрольные вопросы
- •Практическая работа № 20
- •Задание 1
- •Контрольные вопросы
- •Практическая работа № 21
- •Уровни привилегий и пользователи
- •Отмена привилегий и удаление пользователей
- •Задание 1 Работа локально
- •Варианты заданий предметных областей для создания баз данных Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
Практическая работа № 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
Создать в СУБД 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.
Теперь добавьте запись в таблицу test. В таблице log тоже появится запись, обратите внимание на поле row_id, в нем хранится id вставленной вами строки.
Удалите триггер
DROP TRIGGER `update_test`;
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
Создайте два триггера
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.
