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

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

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

  一. 用原密码的密文来更改密码:

  [sql] view plaincopyprint?
  01.SQL>conn /as sysdba
  02.SQL>select password from dba_users where username='SCOTT';
  03.password
  04.------------------------------
  05.E65E6AF62B2449CF
  06.
  07.SQL>alter user SCOTT identified by values 'E65E6AF62B2449CF';
  SQL>conn /as sysdba
  SQL>select password from dba_users where username='SCOTT';
  password
  ------------------------------
  E65E6AF62B2449CF

  SQL>alter user SCOTT identified by values 'E65E6AF62B2449CF';

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

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

  [sql] view plaincopyprint?
  01.UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';
  UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';

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

  [sql] view plaincopyprint?
  01.SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');
  02.
  03.
  04.NAME ASTATUS PASSWORD
  05.------------------------------ ---------- ------------------------------
  06.SCOTT 1 E65E6AF62B2449CF
  07.SYS 0 8A8F025737A9097A
  08.
  09.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
  SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');

  NAME ASTATUS PASSWORD
  ------------------------------ ---------- ------------------------------
  SCOTT 1 E65E6AF62B2449CF
  SYS 0 8A8F025737A9097A

  SQL> select username,account_status from dba_users where username in('SYS','SCOTT');

  USERNAME ACCOUNT_STATUS
  ------------------------------ --------------------------------
  SYS OPEN
  SCOTT EXPIRED

  而用户ASTATUS对应的表为:user_astatus_map

  [sql] view plaincopyprint?
  01.SQL> select * from user_astatus_map;
  02.
  03. STATUS# STATUS
  04.---------- --------------------------------
  05. 0 OPEN
  06. 1 EXPIRED
  07. 2 EXPIRED(GRACE)
  08. 4 LOCKED(TIMED)
  09. 8 LOCKED
  10. 5 EXPIRED & LOCKED(TIMED)
  11. 6 EXPIRED(GRACE) & LOCKED(TIMED)
  12. 9 EXPIRED & LOCKED
  13. 10 EXPIRED(GRACE) & LOCKED
  14.
  15.9 rows selected.
  SQL> select * from user_astatus_map;

  STATUS# STATUS
  ---------- --------------------------------
  0 OPEN
  1 EXPIRED
  2 EXPIRED(GRACE)
  4 LOCKED(TIMED)
  8 LOCKED
  5 EXPIRED & LOCKED(TIMED)
  6 EXPIRED(GRACE) & LOCKED(TIMED)
  9 EXPIRED & LOCKED
  10 EXPIRED(GRACE) & LOCKED

  9 rows selected.

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

  [sql] view plaincopyprint?
  01.SQL> UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';
  02.1 row updated.
  03.
  04.SQL> COMMIT;
  05.Commit complete.
  06.
  07.SQL> alter system flush shared_pool;
  08.System altered.
  SQL> UPDATE USER$ SET ASTATUS=0 WHERE NAME='SCOTT';
  1 row updated.

  SQL> COMMIT;
  Commit complete.

  SQL> alter system flush shared_pool;
  System altered.

  再来观察结果:

  [sql] view plaincopyprint?
  01.SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');
  02.
  03.NAME ASTATUS PASSWORD
  04.------------------------------ ---------- ------------------------------
  05.SCOTT 0 E65E6AF62B2449CF
  06.SYS 0 8A8F025737A9097A
  07.
  08.SQL> select username,account_status from dba_users where username in('SYS','SCOTT');
  09.
  10.USERNAME ACCOUNT_STATUS
  11.------------------------------ --------------------------------
  12.SCOTT OPEN
  13.SYS OPEN
  SQL> select name,ASTATUS,password from user$ where name IN('SYS','SCOTT');

  NAME ASTATUS PASSWORD
  ------------------------------ ---------- ------------------------------
  SCOTT 0 E65E6AF62B2449CF
  SYS 0 8A8F025737A9097A

  SQL> select username,account_status from dba_users where username in('SYS','SCOTT');

  USERNAME ACCOUNT_STATUS
  ------------------------------ --------------------------------
  SCOTT OPEN
  SYS OPEN

更改ORACLE 用户的 expired状态的更多相关文章

  1. 如何更改ORACLE 用户的 expired状态

    ORACLE(113) 版权声明:本文为博主原创文章,未经博主允许不得转载. oracle中, 经常用户的状态会变成locked, expired 等状态, 这种情况下怎么处理呢? 首先,  如果是l ...

  2. 【oracle】解锁oracle用户,unlock

    解除oracle用户的锁定状态,例如oracle数据库建立测试实例时默认建立的scott用户,一开始是处于locked状态的,现在我们需要将其解锁,步骤如下: (1)在cmd中登录sqlplus,例如 ...

  3. Oracle用户的初始化问题

    上一篇博文介绍了关于.bashrc和.bash_profile的相关知识,在oracle的用户设置中能发挥作用. 场景:上周准备学习一下oracle,下载了安装文件后,在linux上新建了一个用户or ...

  4. 【用户状态】详细解读Oracle用户ACCOUNT_STATUS的九种状态

    转至:http://blog.itpub.net/519536/viewspace-672276/ DBA_USERS视图中ACCOUNT_STATUS记录的用户的当前状态,一般情况下在使用的正常用户 ...

  5. 【密码】Oracle用户密码系列

    [密码]Oracle用户密码系列 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ...

  6. Oracle用户,权限,角色以及登录管理 scoot 授权

    Oracle用户,权限,角色以及登录管理 1. sys和system用户的区别 system用户只能用normal身份登陆em.除非你对它授予了sysdba的系统权限或者syspoer系统权限. sy ...

  7. window、linux安装jdk,excel 导入oracle,WebService,window 端口查看,svn服务安装,oracle用户解锁

    内存泄露分析插件http://download.eclipse.org/mat/1.3/update-site/birt插件http://download.eclipse.org//birt/upda ...

  8. Oracle用户权限及死锁

    Oracle用户权限表 oracle数据库中涉及到用户权限的三个表,dba_users,all_users,user_users有什么区别 dba_开头的是查全库所有的,all_开头的是查当前用户可以 ...

  9. ORACLE内存结构:PGA And UGA,ORACLE用户进程、服务器进程

    执行一个SQL语句 执行查询语句的过程: 用户进程执行一个查询语句如select * from emp where empno=7839 用户进程和服务器进程建立连接,把改用户进程的信息存储到PGA的 ...

随机推荐

  1. eclipse修改默认工作空间

    新安装的myEclipse(eclipse)第一次启动时就会弹出让你选择工作空间的对话框 如果勾选了Use this as the default and do not ask again 下次要启动 ...

  2. Nginx 之五: Nginx服务器的负载均衡、缓存与动静分离功能

    一.负载均衡: 通过反向代理客户端的请求到一个服务器群组,通过某种算法,将客户端的请求按照自定义的有规律的一种调度调度给后端服务器. Nginx的负载均衡使用upstream定义服务器组,后面跟着组名 ...

  3. [LeetCode]题解(python):022-Generate Parentheses

    题目来源: https://leetcode.com/problems/generate-parentheses/ 题意分析: 题目输入一个整型n,输出n对小括号配对的所有可能性.比如说,如果输入3, ...

  4. C语言新学备忘_1

    #include <stdio.h> //C语言的标准输入 ,输出头文件扩展名为.h的文件称为头文件 //include称为文件包含命令 #include <stdlib.h> ...

  5. Maven Jrebel 多模块热部署方案

    近期在构建maven多模块项目时,发现web module依赖的其它模块,每次都要clean install成一个jar包,然后运行web module才能加载. 本生jrebel是配置在了web m ...

  6. MFC基础类源码CPP实现文件

    WinMain.CPP---->AfxWinMain()  //近似可认为是WinMain()函数的入口 VIEWCORE.CPP---->CView DOCCORE.CPP----> ...

  7. hpuoj回文串问题(manacher+kmp)

    1699: 回文串问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 3 [提交][状态][讨论版] 题目描述 还是回文串问题,字符串是啥,大家应该都知道,就是满足 S[ ...

  8. Object 保存到文件中

    6月4日 Object 保存到文件中  Q. 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中  A. 方案  确保你的类遵循 NSCodi ...

  9. VS2005+WINDDK+Driver Studio 3.2个人总结

    通过在网上搜索大量的资料,终于把环境搭建起来.对于我这样的驱动新手来说,理应把高手们的东西整理并总结下,方便以后的初学者. 这三个软件的安装顺序没有具体规定,也有高手推荐的顺序,我自己也是重复安装卸载 ...

  10. C#学习之在辅助线程中修改UI控件----invoke方法

    Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...