主要方法是利用公有同义词。注意的地方是必须要将同义词对应的对象查询权限授予相应的用户。
下面给出一个示例:
-
在easytong用户下创建一个视图,视图名为:
vw_mc_transaction
; -
然后将这个视图的查询权限赋予给相应的用户,这里给所有用户:
GRANT SELECT ON easytong.vw_mc_transaction TO PUBLIC
; -
由于在easytong用户下不能创建一个与
vw_mc_transaction
同名的同义词(对象名冲突),所有切换到管理员用户,如SYS用户下创建一个公有同义词:
CREATE PUBLIC SYNONYM mc_transaction FOR easytong.vw_mc_transaction
; -
我们在另外一个用户etplus下就可以通过访问同义词来easytong用户下的视图了:
SELECT * FROM mc_transaction
; -
如果用户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');