使用當前使用者的資料庫鏈的實現

yangtingkun發表於2008-01-21

今天在嘗試使用當前使用者的資料庫鏈的時候發現了一個問題。

 

 

在建立一個資料庫鏈的時候,由於不打算將密碼輸出到螢幕上,因此選擇了使用不加CONNECT TO語句的資料庫鏈,也就是說,資料庫鏈會使用當前登陸資料庫的使用者和密碼來嘗試連線遠端資料庫。

這種情況要求當前的使用者名稱和密碼與遠端資料庫中的一致。由於當前使用者是一致的,因此只需要透過SQLPLUSPASSWORD命令修改當前使用者的密碼,就可以保證遠端資料庫的使用者密碼和當前登陸使用者密碼一致,這樣不需要將使用者密碼輸出到螢幕,也不會以明文的方式儲存到資料庫中,還達到了訪問遠端物件的目的。

不過在操作當中發現了一個有趣的現象,下面透過一個例子來展示說明,不過為了大家可以看得更清楚,這裡將PASSWORD命令替換為了ALTER USER IDENTIFIED BY語句:

SQL> CONN YANGTK/YANGTK@YTK92
已連線。
SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> ALTER USER YANGTK IDENTIFIED BY TEST;

使用者已更改。

SQL> CONN YANGTK/TEST@YTK102
已連線。

首先更改YTK102資料庫中的使用者名稱密碼,以便下面重現問題:

SQL> CREATE DATABASE LINK YTK92 USING 'YTK92';

資料庫連結已建立。

SQL> SELECT * FROM GLOBAL_NAME@YTK92;
SELECT * FROM GLOBAL_NAME@YTK92
                          *
1 行出現錯誤:
ORA-01017: invalid username/password; logon denied
ORA-02063:
緊接著 line (起自 YTK92)


SQL> DROP DATABASE LINK YTK92;

資料庫連結已刪除。

SQL> ALTER USER YANGTK IDENTIFIED BY YANGTK;

使用者已更改。

SQL> CREATE DATABASE LINK YTK92 USING 'YTK92';

資料庫連結已建立。

SQL> SELECT * FROM GLOBAL_NAME@YTK92;
SELECT * FROM GLOBAL_NAME@YTK92
                          *
1 行出現錯誤:
ORA-01017: invalid username/password; logon denied
ORA-02063:
緊接著 line (起自 YTK92)

即使修改了當前使用者的密碼,使其與遠端一致,資料庫鏈仍然無法訪問,報錯不正確的使用者名稱、密碼。

只有使用新的密碼重新登陸資料庫,資料庫鏈才能使用:

SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> SELECT * FROM GLOBAL_NAME@YTK92;

GLOBAL_NAME
----------------------------------------
YTK92.YTK_THINKPAD

這個現象說明,Oracle在使用當前使用者建立資料庫鏈的時候,是透過使用者登陸時輸入的使用者名稱、密碼資訊來建立資訊的,而不是透過儲存在資料庫中的使用者名稱、密碼資訊。登陸是輸入的使用者名稱和密碼資訊儲存在當前會話的上下文中。如果使用者改變了當前的使用者的密碼,這個時候只是資料庫中儲存的密碼資訊發生了變化,這並不會影響到當前這個已經存在的會話,而且,也不會影響記憶體中已經儲存的使用者名稱、密碼資訊。

Oracle建立資料庫使用的使用者名稱密碼並不會由於當前使用者修改了密碼而有所改變,因此只用重新登陸,輸入新的使用者名稱、密碼之後,當前使用者的資料庫鏈才能使用修改後的密碼來建立連線。

這也說明了JOB方式為什麼無法使用不帶CONNECT TO語句的資料庫鏈。由於JOB的啟動不需要輸入使用者名稱、密碼資訊,因此自動執行的JOB就無法包含使用者名稱、密碼來建立資料庫鏈連線。而如果使用者手工執行JOB,當前會話中儲存的使用者名稱、密碼就可以用來建立資料庫鏈。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-155638/,如需轉載,請註明出處,否則將追究法律責任。

相關文章