gpt4 book ai didi

Mysql:可以在更新第一列后强制更新第二列吗?

转载 作者:行者123 更新时间:2023-11-29 03:41:08 26 4
gpt4 key购买 nike

我有一个存储登录数据的 Mysql 数据库。密码和盐保存为 sha512 哈希。现在,如果更改密码列中的值,我想执行一个条件,即盐必须更改,否则 mysql 命令无效。

CREATE TABLE loginData(
id int UNSIGNED SERIAL DEFAULT VALUE,
email varchar(64) NOT NULL,
password binary(64) NOT NULL,
salt binary(64) NOT NULL,
PRIMARY KEY(id))
ENGINE=InnoDB;

现在,我正在考虑诸如外键完整性约束之类的东西,但显然我不应该将密码和盐列连接为外键。有什么方法可以防止在 Mysql 端更新 only 密码列 - 因此必须提供新的盐?仅在访问代码方面阻止它感觉不完整。

最佳答案

您可以采用的一种方法是不实际更新密码更改的登录记录,而是插入新记录。您需要更改架构以添加名为 active 或类似名称的 tinyint 字段名,以存储指示哪个是事件登录的标志。

然后您可以在 email/salt 和 email/password 上添加唯一索引,以强制这些组合的唯一性,这意味着您永远不会有相同的 email 和相同的 salt 输入,也永远不会输入相同的 email/password组合。任何具有相同电子邮件/盐或电子邮件/密码的插入都会失败。如果您不需要密码唯一性(您显然可以不添加电子邮件/密码唯一性索引)。

当您查找登录以实际执行凭据检查时,您只需将 WHERE active = 1 添加到您的查询过滤器。

您可能还希望将插入新盐和密码记录并将旧行更新为 active = 0 的操作包装在事务中,以便整个事务成功或失败,因此防止用户在没有登录的情况下卡住。

关于Mysql:可以在更新第一列后强制更新第二列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13709963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com