文章中介绍了两种使用户密码在 N 天后过期的方法。第一个不提供宽限时间,另一个提供宽限时间供用户考虑。
1、密码立即过期,没有宽限时间
2、密码在 N 天后过期并有宽限时间
密码立即过期,没有宽限时间
“立即”是指“立即生效”。在一些紧急的安全事件中,需要立即使用户的密码失效。这意味着没有宽限时间,必须在登录数据库后立即更改密码。
使用ALTER USER PASSWORD EXPIRE语句使用户的密码立即过期。
SQL> alter user hr password expire;
User altered.
受影响的用户将收到ORA-28001:登录数据库时密码已过期。必须当场更改自己的密码,否则进一步的行动将无处可去。
密码在 N 天后过期并有宽限时间
对于有很多用户的数据库,应该以更慎重的方式使他们的密码过期。
在这种情况下,可以为用户提供了3天的修改密码的宽限期,用户可以在宽限期内花时间思考新密码。配置文件中设置的宽限时间参数也称为PASSWORD_GRACE_TIME。
更改 PASSWORD_GRACE_TIME
该步骤是可选的。如果profile中PASSWORD_GRACE_TIME的值已经是一个特定的数字,比如7天,那么可以跳过这一步。
在这里,将profile中的PASSWORD_GRACE_TIME的值更改为 3 天。
SQL> show user
USER is "SYS"
SQL> select username, profile from dba_users where username in ('HR', 'OE', 'SH') order by 1, 2;
USERNAME PROFILE
---------- ----------
HR APP_USER
OE APP_USER
SH APP_USER
SQL> alter profile app_user limit password_grace_time 3;
Profile created.
请在发出ALTER PROFILE语句之前记住PASSWORD_GRACE_TIME的原始值,以便稍后将其改回。
设置到期日期
这一步是整个过程的关键。我们通过直接更新表SYS.USER$中的EXPTIME将用户的过期时间设置为 3 天后。
SQL> update user$ set exptime = sysdate + 3, ltime = null, lcount = 0, astatus = 18, spare6 = systimestamp at time zone 'UTC' where name in ('HR', 'OE', 'SH');
3 rows updated.
SQL> commit;
Commit complete.
不要忘记提交您的更改。之后,用户登录数据库时会看到一条警告消息:
C:\Users\edchen>sqlplus hr/hr@orclpdb
...
ERROR:
ORA-28002: the password will expire within 3 days
3 天后,宽限时间用完,他们看到一条不同的错误消息:
C:\Users\edchen>sqlplus hr/hr@orclpdb
...
ERROR:
ORA-28001: the password has expired
Changing password for hr
New password:
改回 PASSWORD_GRACE_TIME
如果您跳过了第 1 步,那么您也可以跳过这一步。
3 天后,我们可以将PASSWORD_GRACE_TIME改回原来的限制。例如:
SQL> alter profile app_user limit password_grace_time unlimited;
Profile altered.




