2012-05-17 2 views
1

사용자의 현재 비밀번호가 최근 사용한 비밀번호 5 개와 일치하지 않아야합니다. 만료 된 암호는 이와 비슷한 테이블에 저장됩니다. mysql, 만료 된 비밀번호의 수를 제한하기 위해 삽입시 트리거

################################################################ 
#        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 ; 
+0

'id'가있는 경우 왜'attr_datetime'을 사용해야합니까? 어쩌면'WHERE id = (SELECT MAX (id) FROM user_attributes WHERE u_id = @user_id AND label = 'expired_pass''와 같이 ORDER BY 절에'DESC'를 사용하면 가장 최근의 암호를 지울 수 있습니다. 그것? –

+0

그런 방식으로 ID를 사용하는 것에 대해 생각하지 않았습니다. 내 문제를 해결해 주셔서 감사합니다. –

+1

아마도 MIN (id)가 더 정확할 것입니다. – user7116

답변

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' 
      ) 

P.S. comment의 @sixlettervariables 및 advice의 Brock에 감사드립니다.

관련 문제