某天,应用管理员跑过来说应用挂了,重启中间件报错,和上次挂的情况一样,就是数据库用户密码过期了。乍一想,好办,改密码重启中间件就解决了。但问题来了,应用开会暂时联系不上,在不知道数据库用户密码的情况下怎样刷新密码让其正常使用呢?如果是locked状态还好办, sysdba直接执行alter user 用户名 account unlock 就可以了.但是如果变成expired状态, 因为账户过期,必须要用户更改密码, 账户才能重新使用. 下面将介绍在不修改密码而且不知道密码的情况下,刷新数据库用户密码的方法。
惯例,环境介绍和常用的一个表dba_users:表里面有用户名和加密的密文(有些版本此字段为空,但也不影响,比如本实验环境就是如此)

1. 用数据库用户密码的密文来更改密码:
实验的版本dba_users的password字段为空,通过PL/SQL DEVELOPER查看一下dba_users的构成:

可以看出password来自user$表,继续查看user$表

这就简单了,修改为原来的密码进行刷新:

这种情况下,虽然我们不知道原密码是什么,但可以用它的密文来更改密码,这样,在不知道原密码的情况下,既保持了密码不改变, 又可以把expired的状态更改掉,应用启动,正常使用。
2. 网上的其它方法
下面这一条语句搞定,不管用户的状态是什么:
UPDATE USER$ SET ASTATUS=1 WHERE NAME='SH';
原理详解:
用户的信息都是存在user$这样一个系统表里面的,而用户ASTATUS对应的表 为:user_astatus_map

关键是user$表本身是可以更改的, 所以此时我们就可以直接把用户的ASTATUS字段改成0就可以了。
但个人不喜欢这种方法,因为官方文档的Reference没有对此系统表的说明。方法一执行的语句可能还在后台执行了其它动作,方法二语句可能会忽视了其它动作。作为一个DBA,要严谨,避免挖坑给自己。
总结:oracle刷新密码可以用语句alter user username identified by values '密码的密文'来刷新,密码的密文可以在系统表user$的password字段找到。




