我正在优化我的登录系统,在其中维护用户以前的密码,用于维护密码的pwd表的架构如下:
这里的userId指的是用户表的主键。 如果status属性为1,则表示该行已标记当前密码,如果它为0以前的密码。
如何编写触发器,以便在 pwd 中为任何用户创建新条目 表中,该用户之前的所有状态都会设置为 0,新值将保留 1 作为 status 属性的默认值。目前我正在应用程序级别这样做。
最佳答案
这是不可能的,因为它需要一个变异(更改它所触发的同一个表)触发器,而这在 MySQL 中是被禁止的。
尽管您可以创建存储过程,但您仍然需要从客户端代码显式调用它。
现在,更好的架构设计是将所有当前密码保存在一个表中(大概在 users
表中),并将所有以前的密码保存在另一个表中(即 pwd_history
)。它不仅可以更快地查询当前密码,还允许您选择使用触发器。
DELIMITER //
CREATE TRIGGER tg_pwd_history
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
IF NOT NEW.pwd <=> OLD.pwd THEN
INSERT INTO pwd_history (`userId`, `pwd`, `ts`)
VALUES (NEW.id, OLD.pwd, NOW());
END IF;
END//
DELIMITER ;
这是一个 SQLFiddle 演示
现在我非常希望您不要以纯文本形式存储它们。
关于mysql - 使用触发器将所有密码状态重置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30556346/