使用触发器将所有密码状态重置为零
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演示
现在我非常希望您不要以纯文本形式存储它们。
我正在优化我的登录系统,我在其中维护用户以前的密码,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演示
现在我非常希望您不要以纯文本形式存储它们。