資料庫鏈與同義詞

yangtingkun發表於2007-02-28

建立包含資料庫鏈的同義詞時需要額外的注意,否則很可能會出現問題。


如果同義詞指向當前使用者的物件,那麼不會存在任何問題:

SQL> CONN YANGTK/YANGTK@YTK已連線。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';

資料庫連結已建立。

SQL> SELECT COUNT(*) FROM TEST@TEST2;

COUNT(*)
----------
5

SQL> CREATE SYNONYM TEST FOR TEST@TEST2;

同義詞已建立。

SQL> SELECT COUNT(*) FROM TEST;

COUNT(*)
----------
5

如果是其他使用者建立同義詞指向TEST@TEST2,則會出現問題:

SQL> CREATE USER ABC IDENTIFIED BY ABC;

使用者已建立。

SQL> GRANT DBA TO ABC;

授權成功。

SQL> CONN ABC/ABC@YTK已連線。
SQL> CREATE SYNONYM TEST FOR YANGTK.TEST;

同義詞已建立。

SQL> SELECT COUNT(*) FROM TEST;
SELECT COUNT(*) FROM TEST
*
1 行出現錯誤:
ORA-02019:
未找到遠端資料庫的連線說明

導致這個問題的最根本原因是資料庫鏈,由於資料庫鏈格式的特殊性,決定了其無法通過SCHEMA.DBLINK_NAME的方式訪問。所以,使用者只能訪問當前使用者下的資料庫鏈或PUBLIC資料庫鏈。

而對於同義詞而言,只是一個別名而已,實際執行的時候,仍然會替換成原本的名稱,所以實際上執行的是:SELECT COUNT(*)FROM TEST@TEST2

而當前使用者並不包含資料庫鏈,所以出現了上面的錯誤。

這個時候需要在當前使用者下建立同樣的資料庫鏈:

SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';

資料庫連結已建立。

SQL> SELECT COUNT(*) FROM TEST;

COUNT(*)
----------
5

如果同義詞指向的是全域性資料庫鏈則不會出現這個問題。

還有一點需要注意,如果當前使用者已經存在一個同名的指向其他資料庫的資料庫鏈,或者使用者人為的建立了一個這樣的資料庫鏈,就會造成錯誤的結果。

SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TESTDATA';

資料庫連結已建立。

SQL> SELECT COUNT(*) FROM TEST;

COUNT(*)
----------
1

SQL> SELECT COUNT(*) FROM YANGTK.TEST;

COUNT(*)
----------
1

SQL> CONN YANGTK/YANGTK@YTK已連線。
SQL> SELECT COUNT(*) FROM TEST;

COUNT(*)
----------
5

表面上兩個使用者訪問的是同一個物件,但是兩個使用者時間上訪問的是不同的資料庫,這裡一定要小心。

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

相關文章