使用触发器将所有密码状态重置为零

时间:2015-05-31 10:27:45

标签: mysql triggers

我正在优化我的登录系统,其中我维护用户的先前密码,用于维护密码的 pwd 表的模式如下:

Password table schema

这里userId指的是用户表的主键。 如果状态属性为1,则表示如果以前的密码为0,则行已标记当前密码。

如何编写触发器,以便在 pwd 中为任何用户创建新条目 表,该用户之前的所有状态都设置为0,新值将保持为1作为状态属性的默认值。目前我在应用程序级别这样做。

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 演示

现在我非常希望你不要用纯文本存储它们。