1

ユーザーの現在のパスワードが、最後に使用した5つのパスワードと一致しないようにする必要があります。期限切れのパスワードは、次のようなテーブルに保存されます。

################################################################
#                             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 ;
4

1 に答える 1

3

使用を避け、以下attr_datetimeに依存することができますid

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

PSコメントをくれた@sixlettervariablesとアドバイスをくれたBrockに感謝します。

于 2012-05-17T21:15:04.283 に答える