資料庫鏈與同義字

來源:互聯網
上載者:User

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

如果同義字指向目前使用者的對象,那麼不會存在任何問題:

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

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.