默認的情況下,oracle里面的用戶A,要訪問用戶B的表需要帶用戶B的前綴,如訪問用戶B的 user表,
需要這樣訪問 select * from B.user;如果想要不添加用戶前綴,
需要這樣處理:(user01 就是A用戶)
1.用視圖 create view user select * from B.user;
2.使用同義詞:
grant CREATE SYNONYM to user01; --使用DBA或者有權限的用戶授權
create synonym user for B.user;
備注:前提都是需要使用B用戶對A用戶進行表訪問的授權
grant select on user to user01;
發現百度后很多方法都是這個
但是這和創建一個視圖有什么區別,沒明白
后來想到這是(有兩種方法:視圖或同義詞)
備注:隨筆中內容來源於網上資料整理,僅供參考。
附:
如把user1.table1在user2中建一個同義詞table1
create synonym table1 for user1.table1;
這樣當你在user2中查select * from table1時就相當於查select * from user1.table1;
例如:
在oracle中對用戶的管理是使用權限的方式來管理的,也就是說,
如果我們想使用數據庫,我們就必須得有權限,但是如果是別人將權限授予了我們,
我們也是能對數據庫進行操作的,但是我們必須要已授權的表的名稱前鍵入該表所有者的名稱,
所以這就是比較麻煩的,遇到這種情況,我們該怎么辦呢?
創建個同義詞吧!這樣我們就可以直接使用同義詞來使用表了。
對另一個數據對象而言同義詞是一個別名。
public同義詞是針對所有用戶的,
相對而言private同義詞則只針對對象擁有者或被授予權限的賬戶。
在本地數據庫中同義詞可以表示表、視圖、序列、程序、函數或包等數據對象,也可以通過鏈接表示另一個數據庫的對象。
創建同義詞語法如下:
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];
例:
CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod;
CREATE SYNONYM plan_table FOR system.plan_table;
1、私有同義詞 只能被當前用戶訪問。
2、公有同義詞 可被所有的數據庫用戶訪問。
創建同義詞語法:
create [or replace] [public]
synonym 同義詞名稱
for [用戶名.]對象名;
注釋:[]中表示可寫、或不寫;
[or replace]表示如果已經有了你要創建的同義詞就取代/替換原有的同義詞;
[public]表示是否把同義詞公有
-------------------------
假設oracle有以下兩個用戶: admin , visitor
我們在admin下建立了 testtable 這個表,並且對visitor用戶賦權
然后我們用visitor登陸 : 查詢這個表的時候我們一定需要這樣寫
select * from admin.testtable
如果直接寫 select * from testtable oracle會報錯說表不存在
但是我們可以在visitor里建立[私有同義詞] 讓 testtable = admin.testtable
這樣在visitor下就可以直接輸入 select * from testtable進行查詢
但是如果用戶很多的情況下會覺得很麻煩,因為每個用戶都需要加[私有同義詞] testtable=admin.testtable
所以就出現了 [公有同義詞]
直接在admin用戶下建立公有同義詞 testtable = testtable
這樣做好后,所有的用戶都可以直接使用
select * from testtable 進行訪問而並不需要加前綴,也不用再加[私有同義詞]了
-------------------------
解決方案:
創建公有同義詞
create public synonym table_name for user.table_name;
刪除公有同義詞 drop public synonym test1
創建私有同義詞
create synonym B.synonym_name for A.object_name;
前提是A用戶要有create any synonym的權限