您的位置:首页 > 数据库 > Oracle

Oracle用户重命令

2015-12-22 16:03 393 查看
oracle的schema重命名在项目的开发过程中会经常遇见,有了schema重命名可以在很大程度上避免我们犯一些错误,下面我们就通过两种方法来实现Oracle schema rename的方法。

首先,我们来介绍一下Oracle用户管理方面的一些基础知识。如果我们刚装完一个新的数据库,有很多用户都是EXPIRED & LOCKED状态的,这说明该用户是锁定状态和过期状态的,要使用这些用户我们要要先对这些用户进行解锁和修改密码的操作,例如我们查看dba_users视图可以发现scott用户就是EXPIRED & LOCKED状态的,我们执行下面的操作就可以将scott用户变为可以登录的状态:




我们通过上面两个命令就可以将一个用户的状态改变为open状态,这个用户就可以正常的登录了。

其实我们再去进一步的研究就会发现,Oracle数据库的用户的信息是存储在user$这个实体表中的,这个表的表结构如下:



而dba_users只是user$和表user_astatus_map上的一个视图,上面的两个更改用户状态的命令实际上就是改变用户在这个表中的记录,基于此,我们就可以根据user_astatus_map来改变用户的状态。





这样我们可以把一个用户从open状态变为EXPIRED & LOCKED状态,同理,我们通过这个方法也可以将一个用户的状态由EXPIRED & LOCKED转换为其他状态。

另外,profile这个东西我们也要注意一下,简单的说profile就是用来限制用户对资源的使用,例如用户的密码过期时间,可以使用多少的cpu,连接时间,限制用户只能用一个session等等,具体可以限制哪些资源可以查看dba_profiles视图中的resource_name列;下面从几个问题来展示profile的使用!(要使用这个需要开启resource_limit,默认这个参数是false的,我们需要开启,alter system set
resource_limit=true)

1.如何查看用户使用的profile?

1.1执行sql命令:select username,user_id,resource from dba_users where username='xxxx';可以查询出xxxx用户使用的profile

1.2执行sql命令:select * from dba_profiles where profile='XXXX';可以查询出XXXXprofile具体的内容

2.如何通过profile来限制用户使用的资源?

2.1.使用profile来限制用户每次只能单会话模式登录

create profile profile_name one_session limit sessions_per_user 1;

alter user user_name profile profile_name;

( 注意:一个用户只用一个profile)

在这样设置之后,当一个用户如果想连接多个session就会报错:

ERROR:

ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

Warning: You are no longer connected to ORACLE.

2.2.使用profile来限制用户的cpu使用

假设上面的user_name用户已经使用名字为profile_name的profile,我们通过修改profie_name中的cpu_per_session(单位是1/100秒)来达到限制user_name用户使用cpu

alter profile profile_name limit cpu_per_session 100;

好了,上面啰嗦了这么多,现在我们开始本片文章的重点内容—重命名Oracle schema

1. 既然我们已经知道用户的信息是存储在user$实体表中的,那么我们可以通过更新user$表中的记录来达到目的

1.1.首先获取用户的id,本例中我们来重命名scott schema

select username,user_id from dba_users where username='SCOTT';(或者:select user#,name from user$ where name='SCOTT')

USERNAME USER_ID

------------------------------ ----------

SCOTT 83

SCOTT用户的id为83

1.2.更新user$表中的记录

SQL> update user$ set name='SCOTT1' where user#=83;(注意:在更新的时候,新的名字必须为大写,要不在登录的时候会报错)

1 row updated.

SQL> commit;

Commit complete

SQL> alter system checkpoint;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> conn scott1/scott

Connected.

2.通过修改Oracle的隐含参数,_enable_rename_user来开启Oracle的rename功能。

2.1 查看_enable_rename_user

SQL> select t1.ksppinm,t2.ksppstvl,t1.ksppdesc from x$ksppi t1,x$ksppcv t2 where t1.indx=t2.indx and t1.ksppinm like '_enable_rename_user';

KSPPINM KSPPSTVL KSPPDESC

-------------------- -------------------- ----------------------------------------

_enable_rename_user FALSE enable RENAME-clause using ALTER USER statement

2.2修改_enable_rename_user

SQL> alter system set "_enable_rename_user"=true scope=spfile;(注意:在修改隐含参数时,参数必须用双引号引起来)

System altered.

2.3将数据启动到restrict模式下:

SQL> startup restrict force

ORACLE instance started.

Total System Global Area 3290345472 bytes

Fixed Size 2232840 bytes

Variable Size 1795165688 bytes

Database Buffers 1476395008 bytes

Redo Buffers 16551936 bytes

Database mounted.

Database opened.

2.4rename user

SQL> alter user scott1 rename to scott identified by scott;

User altered.

至此,两种重命名oracle schema的方法介绍完毕,很明显,第二种方法需要重启数据库,这是一个很大的弊端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: