在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 Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi
PL/SQL Release10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for IBM/AIX RISC System/6000: Version10.2.0.3.0 - Productio
NLSRTL Version10.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中修复了BUG6900761,使锁定的代理用户不能被使用,但如果用户只是过期,仍然可以被当做代理用户使用。而使用bug 9898461补丁可以使锁定用户和过期用户都不能作为代理用户使用。