mysql,插入时触发以限制存储的过期密码的数量

标签 mysql triggers

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

################################################################
#                             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 并依赖于 id:

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

附言感谢@sixlettervariables 提供 comment和布洛克 advice .

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

相关文章:

php - 以可读格式显示日期

mysql - 如何在 MySQL 数据库中捕获 SQL 语句?

javascript - 如果特定列包含特定值,MongoDB 规则将删除行

php - 如何取出不在两个日期之间的所有行?

MySQL : 1 relational table with 3 colmuns OR 3 relational tables with 2 columns?

sql - SQL Server中检测客户端断开连接

MySQL 触发器更新前错误(错误代码 : 1054. 'workflow_id' 中的未知列 'NEW' )

mysql - 更新后触发使缓存失效

php - 仅回显匹配精确字符串的结果 (PHP)

mysql - 与 SQL 中的相关子查询作斗争