使用當前使用者的資料庫鏈的實現
今天在嘗試使用當前使用者的資料庫鏈的時候發現了一個問題。
在建立一個資料庫鏈的時候,由於不打算將密碼輸出到螢幕上,因此選擇了使用不加CONNECT TO語句的資料庫鏈,也就是說,資料庫鏈會使用當前登陸資料庫的使用者和密碼來嘗試連線遠端資料庫。
這種情況要求當前的使用者名稱和密碼與遠端資料庫中的一致。由於當前使用者是一致的,因此只需要透過SQLPLUS的PASSWORD命令修改當前使用者的密碼,就可以保證遠端資料庫的使用者密碼和當前登陸使用者密碼一致,這樣不需要將使用者密碼輸出到螢幕,也不會以明文的方式儲存到資料庫中,還達到了訪問遠端物件的目的。
不過在操作當中發現了一個有趣的現象,下面透過一個例子來展示說明,不過為了大家可以看得更清楚,這裡將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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 刪除當前資料庫連線使用者資料庫
- 【Script】使用PL/SQL快速清理當前使用者下所有資料庫物件SQL資料庫物件
- Oracle查詢當前使用者和當前使用者下的所有表Oracle
- 【指令碼】快速獲得當前使用者下“暫忘”的資料庫物件資訊指令碼資料庫物件
- 監控當前資料庫的活動session資料庫Session
- 最接近資料庫的當前SCN號資料庫
- 察看當前Session登入的資料庫Session資料庫
- 查詢當前資料庫名、使用者名稱、資料庫伺服器IP、埠、資料庫版本資訊。資料庫伺服器
- CAS配置資料庫,實現資料庫使用者認證資料庫
- MySQL檢視當前資料庫庫MySql資料庫
- 區塊鏈當前的發展現狀區塊鏈
- 如何檢視資料庫當前的狀態?資料庫
- 在一定程度上改善當前塊鏈領域的資料現狀
- 版本影響當前使用者看到的物件物件
- “使用者、組或角色'XXX'在當前資料庫中已存在”問題資料庫
- “無法刪除資料庫,因為該資料庫當前正在使用” – 解決方法資料庫
- 如何在MySQL提示符中顯示當前使用者、資料庫、時間等資訊MySql資料庫
- sql 查詢當前使用者所有表的容量SQL
- 【轉】檢視Oracle當前使用者下的資訊Oracle
- 使用者介面設計--系統的當前物件物件
- 檢視當前Oracle資料庫的時間及其SCN號Oracle資料庫
- 使用mimipenguin實現從當前 Linux 使用者轉儲登入密碼NGUILinux密碼
- 【去重】當SYS和SYSTEM使用者出現重複資料庫物件時的應對措施資料庫物件
- 資料庫及使用者的建立資料庫
- 基於使用者認證的前後端實現後端
- manjaro 新增當前使用者到kvmJAR
- 使用者查詢當前session IDSession
- $request 請求方法 獲取 API 的當前使用者API
- 檢視當前登入的使用者及其IP地址
- js_原生js獲取當前的使用者ipJS
- 如何快速定位當前資料庫消耗 CPU 最高的 sql 語句?資料庫SQL
- Code First 遷移更新資料庫 無需刪除當前資料庫資料庫
- 檢視資料庫的當前連線session,以及其執行的sql資料庫SessionSQL
- swing 實現使用者登入註冊介面(不使用資料庫)資料庫
- js實現的輸出當前農曆日期JS
- Spring Boot應用中如何動態指定資料庫,實現不同使用者不同資料庫的場景Spring Boot資料庫
- Oracle database 19c中獲取當前資料庫版本的方法OracleDatabase資料庫
- 查詢當前資料庫存在某個字串的儲存過程資料庫字串儲存過程