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

ReSet all password status to zero using trigger

我正在优化我的登录系统,我在其中维护用户以前的密码,pwd table 用于维护密码的架构如下:

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

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

这是不可能的,因为它需要有一个在 MySQL.

中被禁止的突变(改变它被触发的相同 table 触发器)

虽然您可以创建一个存储过程,但您仍然需要从客户端代码显式调用它。

现在更好的模式设计是将所有当前密码保存在一个 table 中(大概在 users table 中),而所有以前的密码保存在另一个中(即 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演示

现在我非常希望您不要以纯文本形式存储它们。