首页 > Linux操作系统 > Linux操作系统 > SYS查询不到的同义词
以前没有注意到的一个现象,用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_2在ALL_SYNONYMS中不出现是正常的。
事实上即使在SYS用户下建立同名的同义词,指向同一个远端数据库的同一个用户,S_2同义词仍然在ALL_SYNONYMS中不会出现,对于同义词S_2而言,SYS用户和TEST用户访问的时候依赖的数据库链并不相同,即使两个数据库链是等同的,对于同义词访问而言也是不同的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-627341/ ,如需转载,请注明出处,否则将追究法律责任。