СУБД/Практические занятия №2(2 семестр) — различия между версиями
Материал из Wiki
< СУБД
Vidokq (обсуждение | вклад) (Новая страница: «== Триггеры == Триггеры это особые процедуры которые срабатывают при изменении данных в т…») |
Vidokq (обсуждение | вклад) (→Триггеры) |
||
| Строка 1: | Строка 1: | ||
| − | == Триггеры == | + | == Триггеры '''({{Кр|My}}SQL)'''== |
Триггеры это особые процедуры которые срабатывают при изменении данных в таблицы операторами '''INSERT, UPDATE и DELETE'''. | Триггеры это особые процедуры которые срабатывают при изменении данных в таблицы операторами '''INSERT, UPDATE и DELETE'''. | ||
Версия 12:00, 10 марта 2014
Триггеры (MySQL)
Триггеры это особые процедуры которые срабатывают при изменении данных в таблицы операторами INSERT, UPDATE и DELETE.
Триггеры могут срабатывать как до BEFORE так и после AFTER изменения таблицы. Получается, что триггер может быть в 6 состояниях.
INSERT (BEFORE | AFTER) UPDATE (BEFORE | AFTER) DELETE (BEFORE | AFTER)
Что необходимо для работы
- Cервер БД версии 5.0.2 и выше
- привилегии на использование этой ф-ции (TRIGGER) начиная с версии 5.1.6, до этого было SUPER, но т.к. все локально используют пользователя root, то опасаться нечего
Добавление триггера
Для того чтобы понять работу триггера рассмотрим пример.
Задание Необходимо при добавлении записи в табл user, пароль преобразовывать в хеш md5(), также имя и отчество преобразовывать в инициалы.
- Решение
DELIMITER // 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// DELIMITER ;
Теперь вставляем туда запись
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 | +----+-------------+------+------+----------------------------------+--------+ 1 row in set (0.00 sec)
Как видно всего несколькими строчками можно убрать целые методы, которые мы использовали при регистрации нового пользователя. Теперь еще надо создать триггер на UPDATE таблицы, с таким же телом, чтобы пользователь не смог записать полное имя, отчество и пароль не в МД5();
Создание триггера на BEFORE UPDATE
DELIMITER // 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// DELIMITER ;
Обновление записи
UPDATE `user` SET `fam`='Иванов', `name`='Иван', `otch` = 'Иванович', `pass` = 'пароль', `login` = 'ivan' WHERE id=1;
Итог1
SELECT * FROM `user`;
2 +----+-------------+------+------+----------------------------------+--------+ 3 | id | fam | name | otch | pass | login | 4 +----+-------------+------+------+----------------------------------+--------+ 5 | 1 | Иванов | И | И | e242f36f4f95f12966da8fa2efd59992 | ivan | 6 +----+-------------+------+------+----------------------------------+--------+ 7 8 1 row in set (0.00 sec)
- NEW — для доступа к новым записям
- OLD — для доступа к старым записям
Например, если я обновил фамилию, то новое значение мне доступно через NEW.fam, а к старому OLD.fam