2012-05-17 13 views
1

我要求用戶的當前密碼不能與最近五次使用的密碼匹配。過期的密碼將存儲在類似於此的表格中。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's,爲什麼要用'attr_datetime'?也許做'WHERE id =(SELECT MAX(id)FROM user_attributes WHERE u_id = @user_id AND label ='expired_pa​​ss''?在'ORDER BY'子句中也有'DESC'會刪除最新的密碼,不會它? –

+0

我沒有想過以這種方式使用id,謝謝你解決了我的問題。 –

+1

'MIN(id)'可能更正確。 – user7116

回答

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

附:感謝@sixlettervariables的comment和Brock的advice