在
Oracle 10gR2
下,我们可以使用企业用户代理(
Enterprise User Proxy
),来通过其他用户登录数据库。
使用的语句格式如下:
ALTER USER target_user GRANT CONNECT THROUGH proxy_user;
来看一个简单的例子:
SQL>conn / as sysdba
Connected.
SQL>select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0 .3.0 - 64bi
PL/SQL Release 10.2.0 .3.0 - Production
CORE 10.2.0 .3.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0 .3.0 - Productio
NLSRTL Version 10.2.0 .3.0 - Production
SQL>create user test1 identified by test1;
User created.
SQL>create user test2 identified by test2;
User created.
SQL>alter user test2 grant connect through test1;
这里的test1
为test2
的代理用户
User altered.
SQL>grant connect,resource to test2;
Grant succeeded.
SQL>conn test2/test2;
Connected.
SQL>create table t2 (num number);
Table created.
这里创建了
2
个用户:
test1
和
test2
。
假设我目前不知道
test2
用户的密码,又想以
test2
登录数据库,就可以使用
test1
以代理用户方式登录数据库:
SQL>conn test1[test2]/test1
使用代理用户test1
登录数据库
Connected.
SQL>show user
USER is "TEST2"
SQL>desc t2
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NUMBER
SQL>insert into t2 values(1);
1 row created.
SQL>commit;
Commit complete.
SQL>select * from t2;
NUM
----------
1
另外,这里即使代理用户
test1
被锁定,仍然可以代理登录:
SQL>conn / as sysdba
Connected.
SQL>alter user test1 account lock;
User altered.
SQL>conn test1[test2]/test1
Connected.
SQL>select * from t2;
NUM
----------
1
不过如果原用户
test2
被锁定,那么登录会报失败:
SQL>conn / as sysdba
Connected.
SQL>alter user test2 account lock;
User altered.
SQL>conn test1[test2]/test1
ERROR:
ORA-28000: the account is locked
Warning: You are no longer connected to ORACLE.
在
11.2
版本前(除了
10.2.0
.5
),这是个期望行为,因为当使用代理用户登录数据库时,
Oracle
只关心
2
点:
(1)
被代理用户是否有连接数据库的权限
(2)
代理用户的用户名和密码是否匹配
除此之外,
Oracle
是不会关心代理用户是否有
CONNECT
权限,是否被锁定等方面问题。
在
11.2.0
.1
和
10.2.0.5
中修复了
BUG
6900761
,使锁定的代理用户不能被使用,但如果用户只是过期,仍然可以被当做代理用户使用。而使用
bug 9898461
补丁可以使锁定用户和过期用户都不能作为代理用户使用。
回收权限
alter user scott revoke connect through sudo;