• 如何更改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 
  • 相关阅读:
    CF1051D Bicolorings dp
    loj2480 [CEOI2017]One-Way Streets 边双+树上差分
    有趣的支配树
    AtCoder Regular Contest 81
    [BZOJ5305][HAOI2018]苹果树(DP)
    [BZOJ4699]树上的最短路(最短路+线段树)
    [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)
    [Luogu4724][模板]三维凸包(增量构造法)
    [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)
    [WC2014]时空穿梭(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/lcword/p/7346045.html
Copyright © 2020-2023  润新知