Menu Close

Oracle不同用户间访问表不添加用户名(模式)前缀

主要方法是利用公有同义词。注意的地方是必须要将同义词对应的对象查询权限授予相应的用户。
下面给出一个示例:

  1. 在easytong用户下创建一个视图,视图名为:vw_mc_transaction

  2. 然后将这个视图的查询权限赋予给相应的用户,这里给所有用户:GRANT SELECT ON easytong.vw_mc_transaction TO PUBLIC;

  3. 由于在easytong用户下不能创建一个与 vw_mc_transaction 同名的同义词(对象名冲突),所有切换到管理员用户,如SYS用户下创建一个公有同义词:
    CREATE PUBLIC SYNONYM mc_transaction FOR easytong.vw_mc_transaction;

  4. 我们在另外一个用户etplus下就可以通过访问同义词来easytong用户下的视图了:SELECT * FROM mc_transaction;

  5. 如果用户etplus下有一张与公有同义词同名的对象(也即:mc_transaction),那么不添加用户名前缀时优先访问是当前用户下对象,如果想访问公有同义词的话就必须要访问同义词对应的原表信息,也即:SELECT * FROM easytong.vw_mc_transaction;

如果不清楚同义词指向的表的话,可以通过查询all_synonyms视图:

SELECT *
  FROM All_Synonyms x
 WHERE x.synonym_name = 'MC_TRANSACTION';

像我们常见的v$session,v$log均为公有同义词:

SELECT *
  FROM dba_synonyms x
 WHERE x.synonym_name IN('V$LOG', 'V$SESSION');