ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SYS查询不到的同义词

SYS查询不到的同义词

原创 Linux操作系统 作者:yangtingkun 时间:2010-02-20 23:21:21 0 删除 编辑

以前没有注意到的一个现象,用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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077344