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

时间:2012-05-17 20:00:33

标签: 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 ;

1 个答案:

答案 0 :(得分:3)

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

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

P.S。感谢comment的@sixlettervariables和advice的Brock。