我要求用户的当前密码不能与最后五个使用的密码匹配。过期的密码将存储在与此类似的表中。

################################################################
#                             table_A                          #
################################################################
# id #     label    # attr_string #    attr_datetime    # u_id #
################################################################
#  1 # expired_pass #  some_hash  # YYYY-MM-DD HH:MM:SS #  1   #
#  2 # expired_pass #  some_hash  # YYYY-MM-DD HH:MM:SS #  1   #
#  3 # expired_pass #  some_hash  # YYYY-MM-DD HH:MM:SS #  1   #
#  4 # expired_pass #  some_hash  # YYYY-MM-DD HH:MM:SS #  1   #
#  5 # expired_pass #  some_hash  # YYYY-MM-DD HH:MM:SS #  1   #
################################################################

现在我想要一个触发器,在输入检查时,如果已经存储了>=5个过期密码,如果是,那么删除最旧的密码。这就是我到目前为止想出来的。
DELIMITER //
    CREATE TRIGGER removePass AFTER INSERT ON `user_attributes`(
        SET @user_id := SELECT u_id FROM `user_attributes` WHERE id = LAST_INSERT_ID()//
        SET @num := SELECT COUNT(id) FROM `user_attributes` WHERE u_id = @user_id AND label = 'expired_password'//
        IF @num >= 5 THEN
            DELETE FROM `user_attributes`
            WHERE id IN(
                SELECT id
                FROM `user_attributes`
                WHERE u_id = @user_id
                AND label = 'expired_pass'
                ORDER BY attr_datetime DESC
                LIMIT 1

            )
        END IF
    )//
DELIMITER ;

最佳答案

您可以避免使用attr_datetime并依赖ids:

DELETE FROM `user_attributes`
            WHERE id = (
                SELECT MIN(id)
                FROM `user_attributes`
                WHERE u_id = @user_id
                AND label = 'expired_pass'
            )

另外,感谢@sixtlettervariables的comment和Brock的advice

关于mysql - mysql,在插入时触发以限制存储的过期密码的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10642670/

10-12 12:41
查看更多