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

标签 mysql triggers

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

Password table schema

这里的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/

相关文章:

mysql获取最小日期,用group by组合列

PHP 不将日期存储在 MySQL 表列中

MySQL 触发器 - 获取 json 字段的新旧值之间的差异

sql-server - 如何保存现有触发器中的更改?

google-apps-script - 如何识别 Google Script 是作为触发器启动还是手动启动?

python - 使用django在模板页面中显示列表值

php - $_POST[] - 不同的提交按钮不是恒定的

mysql - 已设置MYSQL_ROOT_PASSWORD,但在Docker容器中获取 “Access denied for user ' root'@'localhost'(使用密码:是)

sql-server - 如果 SQL Server 中的事务失败,触发器是否会回滚?

java - Java中如何根据日期高效触发事件?