如何更改ORACLE 用户的 expired状态

 


oracle中, 经常用户的状态会变成locked, expired 等状态, 这种情况下怎么处理呢?


首先,  如果是locked状态还好办, DBA直接执行alter user scott account unlock 就可以了.

但是如果变成expired状态, Oracle本身是不提供解锁的语句的, 因为账户过期,必须要用户更改密码, 账户才能重新使用. 但有些时候, 因为各种原因, 我们并不知道原密码的明文是什么,这时候就很麻烦了, 经研究发现,有两种方法可以实现:


as sysdba  

  • SQL>select password from dba_users where username='SCOTT';  
  • password  
  • ------------------------------  
  • E65E6AF62B2449CF  
  •   
  • SQL>alter user SCOTT identified by values 'E65E6AF62B2449CF';  


这种情况下,虽然我们不知道原密码是什么,但可以用它的密文来更改密码,这样,在不知道原密码的情况下,既保持了密码不改变, 又可以把expired的状态更改掉.



二.  下面这一条语句搞定,不管用户的状态是什么:

  1. UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';  


原理详解:
 用户的信息都是存在user$这样一个系统表里面的

  1. SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');  
  2.   
  3.   
  4. NAME                              ASTATUS PASSWORD  
  5. ------------------------------ ---------- ------------------------------  
  6. SCOTT                                   1 E65E6AF62B2449CF  
  7. SYS                                     0 8A8F025737A9097A  
  8.   
  9. SQL> select username,account_status from dba_users where username in('SYS','SCOTT');  
  10.   
  11. USERNAME                       ACCOUNT_STATUS  
  12. ------------------------------ --------------------------------  
  13. SYS                            OPEN  
  14. SCOTT                          EXPIRED  



而用户ASTATUS对应的表为:user_astatus_map


  1. SQL> select * from user_astatus_map;  
  2.   
  3.    STATUS# STATUS  
  4. ---------- --------------------------------  
  5.          0 OPEN  
  6.          1 EXPIRED  
  7.          2 EXPIRED(GRACE)  
  8.          4 LOCKED(TIMED)  
  9.          8 LOCKED  
  10.          5 EXPIRED & LOCKED(TIMED)  
  11.          6 EXPIRED(GRACE) & LOCKED(TIMED)  
  12.          9 EXPIRED & LOCKED  
  13.         10 EXPIRED(GRACE) & LOCKED  
  14.   
  15. rows selected.  





关键是user$表本身是可以更改的, 所以此时我们就可以直接把用户的ASTATUS字段改成0就可以了

  1. SQL> UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';  
  2. 1 row updated.  
  3.   
  4. SQL> COMMIT;  
  5. Commit complete.  
  6.   
  7. SQL> alter system flush shared_pool;  
  8. System altered.  




再来观察结果:

    1. SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');  
    2.   
    3. NAME                              ASTATUS PASSWORD  
    4. ------------------------------ ---------- ------------------------------  
    5. SCOTT                                   0 E65E6AF62B2449CF  
    6. SYS                                     0 8A8F025737A9097A  
    7.   
    8. SQL> select username,account_status from dba_users where username in('SYS','SCOTT');  
    9.   
    10. USERNAME                       ACCOUNT_STATUS  
    11. ------------------------------ --------------------------------  
    12. SCOTT                          OPEN  
    13. SYS                            OPEN 
posted @ 2017-08-11 15:08  lclc  阅读(333)  评论(0编辑  收藏  举报