Oracle用户解锁

1)用户被锁定,但一直无法解锁 
说明:在个别现场发现一个用户经常被锁住,刚使用[alter user <user_name> account unlock; commit;]然后仍然无法登录,还是一直报错:用户被锁定。 
当前用户:

如何查看当前连接的用户

how   user; 
select   sys_context( 'userenv ', 'session_user ')   from   dual; 
select   user   from   dual;   


查看所有登录的用户 
select   username   from   v$session;

SQL> select count(*) from v$session;

  COUNT(*)
----------
        26
SQL> select machine,terminal from v$session;


SQL> select * from user_role_privs;

USERNAME                       GRANTED_ROLE                   ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SYSTEM                         AQ_ADMINISTRATOR_ROLE          YES YES NO
SYSTEM                         DBA                            YES YES NO
SYSTEM                         MGMT_USER                      NO  YES NO


解决办法:查DBA_USERS表,可以看到用户的状态。是否被锁住(变成LOCKED(TIMED)状态了说明用户被锁定)。 
SQL> select USERNAME , ACCOUNT_STATUS from dba_users;

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
MGMT_VIEW                      OPEN
SYS                                    OPEN
SYSTEM                             OPEN
DBSNMP                             OPEN
SYSMAN                             OPEN
SCOTT                               OPEN
OUTLN                                EXPIRED & LOCKED


select * from USER_HISTORY$ –查看用户口令是否过期 

select * from dba_profiles   –查看用户使用的profile设置 

解决: 
sqlplus /nolog 
conn /as sysdba 
alter user <user_name> account unlock;  –解锁 

alter user <user_name> password expire;  –密码过期 

alter user  <user_name>  identified by <password>; –重设密码 

或者 alter profile default limit failed_login_Attempts unlimited; 

然后登录即可 
【注】若要查看任一账户的口令限期,可查询DBA_USERS数据字典视图的Expire_Date列。若用户自己想查看,可查询USER_USERS数据字典视图的Expiry_Date列(通过SQL*Plus或一个基于客户机的查询工具)。


    有时候我们可能不知道一个用户的密码,但是又需要以这个用户做一些操作,又不能去修改掉这个用户的密码,或者自己干脆忘记密码了,想修改自己的密码,这个时候,就可以利用一些小窍门,来完成操作。
   还有,在数据库安全性检查中有一项首先要完成的工作,就是检查数据库中的用户密码是否还仍然保留着默认值,比如sys的密码是否还是change_on_install,system的密码是否还是manager,scott的密码是否还是tiger。

Oracle 11g之前,我们需要手工来完成这样的工作,大概步骤是:
1. 创建一张自定义的表,保存下常用的系统用户以及默认密码的HASH值。
2. 将系统中的用户密码HASH值与该表中的HASH值比较,如果相同,则表明还在使用默认值。

注意:在数据字典中存储的密码是被HASH算法加密过的,加密后的值不但跟密码本身有关还跟用户名有关,也就是,如果是不相同的用户名那么即使是完全相同的密码,加密后的HASH值也是不一样的。这样保证了每一个用户的每一个密码都有自己独一无二的HASH值。

在Oracle 11g之前,加密后的密码可以从DBA_USERS数据字典的PASSWORD字段中获得,因此可以通过这个字段中存储的值来做是否是默认值的检查。但是在11g中,PASSWORD字段却不再显示密码的内容了。
先看一下文档中对这个字段的描述:    

Indicates whether the user is authenticated by OID (GLOBAL) or externally authenticated (EXTERNAL); NULL otherwise

SQL> SELECT username,decode(password,NULL,'NULL',password) password FROM dba_users;
 
USERNAME                       PASSWORD
------------------------------ ------------------------------
MGMT_VIEW            NULL
SYS                  NULL
SYSTEM                          NULL
DBSNMP                         NULL
SNPM                             NULL
SYSMAN                         NULL
SNPW                            NULL
SCOTT                           NULL
KAMUS                           NULL
OUTLN                           NULL
WMSYS                           NULL
DIP                                NULL
ORACLE_OCM                   NULL
TSMSYS                          NULL
 
14 rows selected
可以看到PASSWORD字段已经不再显示密码内容,全部都为空。

那么,如果再去检查这些用户是否还在使用默认的密码呢?

方法一:从SYS.USER$基表中检查,在基表的password字段中仍然可以查到HASH后的值。

SQL>  SELECT name,password FROM user$ WHERE name='SCOTT';
 
NAME                           PASSWORD
------------------------------ ------------------------------
SCOTT                          F894844C34402B67

方法二:这是推荐的方法,最简单的方法,11g中可以使用的方法,11g提供了新的DBA_USERS_WITH_DEFPWD视图,
该视图中包含了所有还在使用默认密码的用户名。

SQL> ALTER user scott IDENTIFIED BY tiger;
 
User altered.
 
SQL> SELECT * FROM  DBA_USERS_WITH_DEFPWD  WHERE username='SCOTT';
 
USERNAME
------------------------------
SCOTT
 
SQL> ALTER user scott IDENTIFIED BY tiger1;
 
User altered.
 
SQL> SELECT * FROM DBA_USERS_WITH_DEFPWD WHERE username='SCOTT';
 
no rows selected
Oracle对于安全性的支持力求做到业界领先,Oracle始终在每个细节上进步着。

0、表空间
  SQL>select username,default_tablespace from user_users;
  查看当前用户的角色
  SQL>select * from user_role_privs;
  查看当前用户的系统权限和表级权限
  SQL>select * from user_sys_privs;
  SQL>select * from user_tab_privs;
  查看用户下所有的表
  SQL>select * from user_tables;
  1、用户
  查看当前用户的缺省表空间
  SQL>select username,default_tablespace from user_users;
  查看当前用户的角色
  SQL>select * from user_role_privs;
  查看当前用户的系统权限和表级权限
  SQL>select * from user_sys_privs;
  SQL>select * from user_tab_privs;
  显示当前会话所具有的权限
  SQL>select * from session_privs;
  显示指定用户所具有的系统权限
  SQL>select * from dba_sys_privs where grantee='GAME';
  2、表
  查看用户下所有的表
  SQL>select * from user_tables;
SELECT * FROM ALL_TABLES;
  查看名称包含log字符的表
  SQL>select object_name,object_id from user_objects
  where instr(object_name,'LOG')>0;
  查看某表的创建时间
  SQL>select object_name,created from user_objects where object_name=upper('&table_name');
  查看某表的大小
  SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
  where segment_name=upper('&table_name');
  查看放在ORACLE的内存区里的表
  SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
  3、索引
  查看索引个数和类别
  SQL>select index_name,index_type,table_name from user_indexes order by table_name;
  查看索引被索引的字段
  SQL>select * from user_ind_columns where index_name=upper('&index_name');
  查看索引的大小
  SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
  where segment_name=upper('&index_name');
  4、序列号
  查看序列号,last_number是当前值
  SQL>select * from user_sequences;
  5、视图
  查看视图的名称
  SQL>select view_name from user_views;
  查看创建视图的select语句
  SQL>set view_name,text_length from user_views;
  SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
  SQL>select text from user_views where view_name=upper('&view_name');
  6、同义词
  查看同义词的名称
  SQL>select * from user_synonyms;
SELECT * FROM ALL_SYSNONYMS;
  7、约束条件
  查看某表的约束条件
  SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
  from user_constraints where table_name = upper('&table_name');
  SQL>select c.constraint_name,c.constraint_type,cc.column_name
  from user_constraints c,user_cons_columns cc
  where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
  and c.owner = cc.owner and c.constraint_name = cc.constraint_name
  order by cc.position;
  8、存储函数和过程
  查看函数和过程的状态
  SQL>select object_name,status from user_objects where object_type='FUNCTION';
  SQL>select object_name,status from user_objects where object_type='PROCEDURE';
  查看函数和过程的源代码
  SQL>select text from all_source where owner=user and name=upper('&plsql_name');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值