建立包含資料庫鏈的同義字時需要額外的注意,否則很可能會出現問題。
如果同義字指向目前使用者的對象,那麼不會存在任何問題:
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
|
表面上兩個使用者訪問的是同一個對象,但是兩個使用者時間上訪問的是不同的資料庫,這裡一定要小心。