在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補丁可以使鎖定用戶和過期用戶都不能作為代理用戶使用。
