有没有一种方法可以指定通过mysql中的触发器更新的列?

时间:2019-07-12 19:23:01

标签: php mysql sql

(设置场景) 因此,我在数据库中有一个表,其中包含用户密码(密码列),当用户插入新密码时,该密码已通过触发器由MD5加密。该表还保存用户在其网站上发布的点赞次数(“喜欢”列)。该表还具有在进行更新时向md5密码触发的触发器。这样做是为了使用户在编辑个人资料时可以更改密码,并且需要再次对其进行加密。

(主要问题) 我的问题是,当其他用户单击帖子上的“赞”按钮时,它会更新用户喜欢添加1的问题。问题是我的密码列随后又被md5加密了,我不想发生这种情况。 >

(您可以做什么!) 因此,我希望有一种方法可以指定(在mysql中)触发效果的列。当like列更新时,password列中的任何内容均不应更改。但是目前,密码一直在加密。

任何帮助将不胜感激!

我尝试通过php将密码设置为null。然后从数据库中获取密码并再次插入!但是它已经被加密了,所以当它返回数据库时,触发器就生效了,md5命令是对已经被哈希处理的密码执行的。

这是我唯一可以显示在触发框中的代码

设置NEW.Password = MD5(NEW.Password)

1 个答案:

答案 0 :(得分:0)

这里是使用CRYPT的版本,并且以$6$开头的种子使SHA512带有种子。

DELIMITER //

CREATE TRIGGER `before_update_user` BEFORE UPDATE ON `user`
 FOR EACH ROW BEGIN
     if ( OLD.Password != NEW.Password ) then
         -- password has changed, encrypt
         SET NEW.Password = ENCRYPT(NEW.Password, CONCAT('$6$', SHA2(RANDOM_BYTES(64), '256')));
     end if;
END
//

有关不使用MD5的评论是一个很好的建议。有关using CRYPT on security SX的更多信息。请注意,将从8.0.3的MySQL中删除Crypt,并且它们没有加盐版本,因此如果要在触发器中输入保存密码,则需要滚动自己的salt和SHA2。因此,似乎在PHP中执行散列可能是更安全的选择。

合并触发器和准备好的语句没有错。我不知道为什么有人会假设使用触发器意味着prepares语句不在桌面上。始终使用准备好的语句。