相當于alias(別名),比如把user1.table1在user2中建一個同義詞table1
創(chuàng)新互聯是一家專注網站建設、網絡營銷策劃、微信小程序開發(fā)、電子商務建設、網絡推廣、移動互聯開發(fā)、研究、服務為一體的技術型公司。公司成立10余年以來,已經為上千余家成都濕噴機各業(yè)的企業(yè)公司提供互聯網服務?,F在,服務的上千余家客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。
create synonym table1 for user1.table1;
這樣當你在user2中查select * from table1時就相當于查select * from user1.table1;
優(yōu)點自己總結吧。
例如:
在oracle中對用戶的管理是使用權限的方式來管理的,也就是說,如果我們想使用數據庫,我們就必須得有權限,但是如果是別人將權限授予了我們,我們也是能對數據庫進行操作的,但是我們必須要已授權的表的名稱前鍵入該表所有者的名稱,所以這就是比較麻煩的,遇到這種情況,我們該怎么辦呢?創(chuàng)建個同義詞吧!這樣我們就可以直接使用同義詞來使用表了。
1、 當用程序連接或者用plsql查詢同義詞時,如果出現ora-01775:同義詞的循環(huán)鏈這樣的問題。
一般是因為存在同義詞,但同義詞沒有相應的對象。
2、 先查有沒有循環(huán)的同義詞。
select * from dba_synonyms
where table_owner='TEST'
and synonym_nametable_name;
沒有記錄。
3、 再查同義詞沒有對象的數據庫對象
select * from dba_synonyms
where table_owner='TEST'
and
synonym_name in
(select a.synonym_name from dba_synonyms a where a.table_owner='TEST'
minus
select object_name from user_objects)
4、 把查詢出來的結果進行查詢表
select * from DRILL_PRESON
如果該同義詞沒有相應的對象,則會包ora-01775的錯誤
5、 把這個同義詞刪除
drop public synonym DRILL_PRESON
Oracle的同義詞(synonyms)從字面上理解就是別名的意思,和視圖的功能類似,就是一種映射關系。它可以節(jié)省大量的數據庫空間,對不同用戶的操作同一張表沒有多少差別;它擴展了數據庫的使用范圍,能夠在不同的數據庫用戶之間實現無縫交互;Oracle數據庫中提供了同義詞管理的功能。同義詞是數據庫對象的一個別名,經常用于簡化對象訪問和提高對象訪問的安全性。在使用同義詞時,Oracle數據庫將它翻譯成對應方案對象的名字。與視圖類似,同義詞并不占用實際存儲空間,只有在數據字典中保存了同義詞的定義
創(chuàng)建同義詞
CREATE SYNONYM SYSN_TEST FOR TEST;
查看同義詞
SELECT * FROM USER_SYNONYMS
使用同義詞
SELECT * FROM SYSN_TEST;
刪除同義詞
DROP SYNONYM SYSN_TEST;
1、私有同義詞
只能被當前用戶訪問.
2、公有同義詞
可被所有的數據庫用戶訪問.
創(chuàng)建同義詞語法:
create [or replace] [public]
synonym 同義詞名稱
for [用戶名.]對象名;
注釋:[]中表示可寫、或不寫;[or replace]表示如果已經有了你要創(chuàng)建的同義詞就取代/替換原有的同義詞;[public]表示是否把同義詞公有
一、背景
有兩個sid:Asid,Bsid,在Asid下有兩個用戶Auser1,Auser2,在Bsid下有一個用戶Buser1。其中Auser2和Buser1建立了dblink?,F希望通過登錄Buser1訪問Auser1上的三張表table1,table2,table3信息和函數function1。
二、步驟
①登錄Auser1對Auser2授權(若需要刪除則加上)
grant ,select,on table1 to Auser2;
grant ,select,on table2 to Auser2;
grant ,select,on table3 to Auser2;
grant execute on function1 to Auser2;
②登錄Auser2建立同義詞
create synonym table1 for Auser1.table1;
create synonym table2 for Auser1.table1;
create synonym table3 for Auser1.table1;
create synonym function1 for Auser1.function1;
③登錄Buser1查找db_link名(例如查出來的db_link名為mydblink1)
select username,db_link from user_db_links
④建立Buser1的同義詞
create synonym table1 for Auser2.table1@mydblink1;
create synonym table2 for Auser2.table2@mydblink1;
create synonym table3 for Auser2.table3@mydblink1;
create synonym function1 for Auser2.function1@mydblink1;
⑤測試
此時登錄Buser1通過select * from table1就可以訪問table1了。
三、注意點
也可以建立procedure的`同義詞,但是這樣執(zhí)行的過程中不允許commit。如果要提交的話請在如JDBC中commit()。
可以試試CREATE SYNONYM TEST FOR
PCKG_RAF_EFAS_INTERFACE.PROC_GET_ACCESS_TOKEN;
如果不行,可以再自己寫個存儲過程將這個調用存儲過程的部分代碼包起來,對外邊用戶使用來說,也是一樣的效果。