我正在优化我的登录系统,其中我维护用户的先前密码,用于维护密码的 pwd 表的模式如下:
这里userId指的是用户表的主键。 如果状态属性为1,则表示如果以前的密码为0,则行已标记当前密码。
如何编写触发器,以便在 pwd 中为任何用户创建新条目 表,该用户之前的所有状态都设置为0,新值将保持为1作为状态属性的默认值。目前我在应用程序级别这样做。
答案 0 :(得分:0)
这是不可能的,因为它需要在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 演示
现在我非常希望你不要用纯文本存储它们。