SYS查詢不到的同義詞

yangtingkun發表於2010-02-20

以前沒有注意到的一個現象,用SYS使用者在ALL_SYNONYMS檢視中查詢不到其他使用者同義詞的資訊,但是在DBA_SYNONYMS檢視中可以查詢到。

 

 

年前的一次遠端解決問題的過程中發現了這個現象,不過由於當時時間緊張,沒有來得及深入研究是什麼問題導致了這個現象。隨後趕上了春節放假,因此一直沒有跟蹤分析這個問題。

春節假期中倒是想過兩次,最開始懷疑是資料字典出現了不一致,因為對於SYS使用者而言,沒有什麼物件是沒有許可權的,顯然任何物件都應該可以在ALL_檢視中查詢到。

在第二次想起這個問題的時候突然想到了一個問題,很有可能這是正常的現象,於是做了一個簡單的測試在重現這個問題:

SQL> CONN TEST/TEST
Connected.
SQL> SELECT * FROM USER_SYNONYMS;

no rows selected

SQL> CREATE SYNONYM S_1 FOR T;

Synonym created.

SQL> CREATE SYNONYM S_2 FOR T@TESTDATA;

Synonym created.

SQL> SELECT * FROM USER_SYNONYMS;

SYNONYM_NAME         TABLE_OWNER          TABLE_NAME           DB_LINK
-------------------- -------------------- -------------------- ----------
S_2                                       T                    TESTDATA
S_1                  TEST                 T

SQL> SELECT DB_LINK, USERNAME
  2  FROM USER_DB_LINKS;

DB_LINK         USERNAME
--------------- ------------------------------
HO.WORLD        TRD_DSG
TEST231         TEST
TESTDATA        TEST
TESTRAC         U1

SQL> CONN / AS SYSDBA
Connected.
SQL> SELECT DB_LINK, USERNAME
  2  FROM USER_DB_LINKS;

DB_LINK         USERNAME
--------------- ------------------------------
KAIFA           SYSTEM

SQL> SELECT *                 
  2  FROM ALL_SYNONYMS
  3  WHERE WNER = 'TEST';

OWNER      SYNONYM_NAME    TABLE_OWNER     TABLE_NAME DB_LINK
---------- --------------- --------------- ---------- ---------------
TEST       S_1             TEST            T

SQL> SELECT * 
  2  FROM DBA_SYNONYMS
  3  WHERE WNER = 'TEST';

OWNER      SYNONYM_NAME    TABLE_OWNER     TABLE_NAME DB_LINK
---------- --------------- --------------- ---------- ---------------
TEST       S_2                             T          TESTDATA
TEST       S_1             TEST            T

SQL> CREATE DATABASE LINK TESTDATA
  2  CONNECT TO TEST
  3  IDENTIFIED BY TEST
  4  USING '172.25.88.94/testdata';

Database link created.

SQL> SELECT *
  2  FROM DBA_SYNONYMS
  3  WHERE WNER = 'TEST';

OWNER      SYNONYM_NAME    TABLE_OWNER     TABLE_NAME DB_LINK
---------- --------------- --------------- ---------- ---------------
TEST       S_2                             T          TESTDATA
TEST       S_1             TEST            T

SQL> SELECT *
  2  FROM ALL_SYNONYMS
  3  WHERE WNER = 'TEST';

OWNER      SYNONYM_NAME    TABLE_OWNER     TABLE_NAME DB_LINK
---------- --------------- --------------- ---------- ---------------
TEST       S_1             TEST            T

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

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

上面的例子模擬了SYS使用者在ALL_SYNONYMS檢視中查詢不到TEST使用者的S_2同義詞,但是在DBA_SYNONYMS檢視中可以查詢到的情況。

造成這個現象的原因其實很簡單,DBA開頭的檢視表示的資料庫中存在的所有物件,顯然是可以查詢到S_2同義詞的,而ALL開頭的檢視表示的當前使用者下或者當前使用者有許可權訪問的物件,對於普通同義詞而言,由於SYS擁有SELECT ANY TABLE許可權,因此同義詞的基表對於SYS來說是有許可權訪問的,所以同義詞也理應在ALL_SYNONYMS檢視中出現,但是對於基於資料庫鏈的同義詞則不然,由於S_2同義詞依賴TEST使用者下的私有同義詞TESTDATA,而SYS使用者是沒有辦法訪問這個資料庫鏈的,因此S_2ALL_SYNONYMS中不出現是正常的。

事實上即使在SYS使用者下建立同名的同義詞,指向同一個遠端資料庫的同一個使用者,S_2同義詞仍然在ALL_SYNONYMS中不會出現,對於同義詞S_2而言,SYS使用者和TEST使用者訪問的時候依賴的資料庫鏈並不相同,即使兩個資料庫鏈是等同的,對於同義詞訪問而言也是不同的。

 

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

相關文章