一. 問題:
如何實(shí)現(xiàn)在Oracle數(shù)據(jù)庫中訪問其他用戶的表時(shí)不需加表所屬的用戶名
二. 舉例:
Oracle里面的用戶A,要訪問用戶B的表需要帶用戶B的前綴,如訪問用戶B的 TEST表,需要這樣訪問 select * from B.TEST;現(xiàn)在就是問如何才能無需添加用戶名的前綴。
三. 原因:
- 方便訪問常用表
- 隱藏表的用戶
四. 解決方案:
1. 創(chuàng)建同義詞
語法:
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];````
根據(jù)舉例進(jìn)行延伸演示:
(1)登錄sysdba為用戶B授予創(chuàng)建同義詞的操作權(quán)限:
sqlplus /nolog
conn /as sysdba;
grant create synonym to B;
(2)登錄B用戶為A授予訪問特定表TEST的權(quán)限:
//注意:這是A用戶能夠使用同義詞訪問B的TEST表的前提
grant select on TEST to A;
//撤銷的方式:
revoke select on TEST from A;
(3)創(chuàng)建同義詞
create synonym SY_TEST for B.TEST;
(4)登錄用戶A進(jìn)行測試.
#####2.創(chuàng)建視圖
create view VW_TEST select * from B.TEST;
#####3.修改current_schema參數(shù)
用于切換當(dāng)前會(huì)話的架構(gòu)(schema)。在進(jìn)行對象名解析時(shí),如果對象名前沒有限定架構(gòu)名,oracle 會(huì)自動(dòng)在此架構(gòu)下查詢匹配的對象。
例如,當(dāng) scott 用戶執(zhí)行```` select * from emps; ````語句時(shí),oracle 默認(rèn)會(huì)查詢 scott 架構(gòu)下的 emps 表;但是,如果```` alter session set current_schema=xx; ````更改了會(huì)話的當(dāng)前架構(gòu),執(zhí)行此語句時(shí) oracle 會(huì)查詢 xx 架構(gòu)下的 emps 表。
登錄用戶A時(shí),臨時(shí)修改current_schema參數(shù):
SQL> alter session set current_schema=B;
Session altered.
SQL> show user;
USER is "A"
SQL> select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA from dual;
CURRENT_SCHEMA
--------------------------------------------------------------------------------
B
SQL>
SQL> spool off;
這種方式只是適用于當(dāng)前一次會(huì)話,一旦會(huì)話關(guān)閉,下次就不行了.所以此種方式一次可行,但是通用不行.