Триггер на поле неожиданно срабатывает при обновлении другого поля - PullRequest
0 голосов
/ 26 июля 2011

Вот моя таблица:

Id    Password       Status
1     a6cc890..       1

У меня есть триггер на Пароль, который используется для шифрования поля.

Триггер, как показано ниже:

-- Trigger DDL Statements
DELIMITER $$

USE `ediftpdb`$$

CREATE
DEFINER=`edidbo`@`%`
TRIGGER `ediftpdb`.`trigger_format_passwd`
BEFORE INSERT ON `ediftpdb`.`users`
FOR EACH ROW
SET NEW.passwd=md5(NEW.passwd)$$

CREATE
DEFINER=`edidbo`@`%`
TRIGGER `ediftpdb`.`trigger_format_passwd_update`
BEFORE UPDATE ON `ediftpdb`.`users`
FOR EACH ROW
SET NEW.passwd=md5(NEW.passwd)$$

К моему удивлению, триггер срабатывает при обновлении статуса, и пароль снова шифруется!

Что мне делать, чтобы решить эту проблему?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Если вы обновите Status, вы выполняете ОБНОВЛЕНИЕ, и все триггеры ОБНОВЛЕНИЯ сработают. Все, что вам нужно сделать, это сравнить новые и старые значения passwd и применить ваш MD5, только если они отличаются. К счастью для вас, MySQL предоставляет OLD и NEW псевдонимы строк :

Вы можете ссылаться на столбцы в предметной таблице (таблица, связанная с триггером), используя псевдонимы OLD и NEW. OLD.col_name относится к столбцу существующей строки перед ее обновлением или удалением. NEW.col_name относится к столбцу новой строки для вставки или существующей строки после ее обновления. Попробуйте использовать IF:

BEFORE UPDATE ON `ediftpdb`.`users`
FOR EACH ROW
SET NEW.passwd = IF(NEW.passwd = OLD.passwd, NEW.passwd, md5(NEW.passwd))

Это не должно измениться NEW.passwd, если NEW.passwd (новый пароль) и OLD.passwd (хешированный пароль, который уже находится в базе данных) отличаются. Конечно, это может не сработать, если кому-то удастся ввести MD5 своего старого пароля в качестве нового, но это маловероятно.

0 голосов
/ 26 июля 2011

Когда вы «обновляете Status», вы фактически выполняете UPDATE для всей таблицы.Тот факт, что вы изменяете значение только одного поля, в него не входит!

Вы можете вручную проверить, изменилось ли значение passwd, используя идентификаторы NEW и OLD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...