zoukankan      html  css  js  c++  java
  • 如何更改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 
  • 相关阅读:
    容器操作--管理迭代器
    顺序容器--添加及访问元素
    日志记录-20151103
    顺序容器--容器库.迭代器
    使用-flat.vmdk恢复虚拟机
    H3C-交换机维护命令大全
    Centos6.5 安装zabbix-agent 3.0
    Linux系统调试工具之sysdig使用详解
    通过实例学习 tcpdump 命令
    系统之锹sysdig:Linux服务器监控和排障利器
  • 原文地址:https://www.cnblogs.com/lcword/p/7346045.html
Copyright © 2011-2022 走看看