我想存储以前的6个密码,以便每当用户想要更改密码时,首先使用旧密码进行验证并相应返回。
如何在不添加数据库中的任何新列的情况下存储旧密码。
如果可能的话,任何参考。
答案 0 :(得分:2)
我认为您的问题的目标是验证密码是否未被重复使用。因此我建议:
使用字段ID
,TIMESTAMP
以及PASSWORD
等其他数据字段创建其他历史记录表。
create table USER_HIST (ID varchar2(20), TIMESTAMP date, PASSWORD varchar2(20));
在USER
表上创建更新触发器,并在密码更改时在USER_HIST
中插入一个条目。用户只保留最后六个条目。
create or replace trigger "PASSWORD_CHANGE"
before update on USER_TB
for each row
begin
if :new.password <> :old.password then
delete USER_HIST h where h.ID = :old.ID and h.TIMESTAMP =
(select min(TIMESTAMP) from user_hist u where u.ID = :old.ID
having count(*) >= 6);
insert into USER_HIST (ID, TIMESTAMP, PASSWORD) values
(:old.ID, sysdate, :old.PASSWORD);
end if;
end;
在历史记录表中添加约束,以验证之前从未使用过密码。
alter table USER_HIST add constraint pwd_is_not_reused UNIQUE (ID, PASSWORD);
用户更改密码时捕获异常。
答案 1 :(得分:1)
您可以插入多行并获取最近的一行以获取当前密码。 对于验证,您可以使用旧记录检查密码历史记录,如下面的实现。
ID USER_NAME PASSWORD UPDATE_DT
1 用户1 密码1 2015年12月12日
2 用户1 密码2 13/12/2015
3 用户1 password3 14/12/2015
这对学校项目来说几乎没有用。但是,如果您计划生产级代码,那么我建议您重新考虑数据库方法。而且也不要存储纯文本密码。请改用salted hash
。