synonyms(同義詞)就是給數據庫對象取一個別名,因爲同義詞只是一個別名,因此它只需在數據字典中存儲自身的定義,而無需額外的存儲空間。在使用同義詞時,Oracle數據庫將它翻譯成對應方案對象的名字。
同義詞分爲兩種:公共同義詞與私有同義詞。公共同義詞由特殊的用戶組 PUBLIC 所擁有,一般由DBA、SYSTEM、SYS創建,數據庫中的每個用戶都能夠訪問。而私有同義詞屬於某個用戶,此用戶可以通過授權來控制哪些用戶可以使用屬於她的私有同義詞。創建同義詞語法:CREATE [PUBLIC] SYNONYM 同義詞名稱 FOR 用戶.對象。
同義詞主要是出於方便和安全性上的考慮,主要作用如下:
隱藏一個數據庫對象的名字和擁有者 隱藏分佈式數據庫中遠程對象的位置 簡化SQL 語句 和視圖類似能夠限制訪問,用於實現更精細安全的訪問控制下面舉例來說明:
--連接sys用戶
SQL> connect sys/gyb860518 as sysdba;
已連接。
--查詢所有的同義詞
SQL> select synonym_name, table_owner, table_name from user_synonyms;
SYNONYM_NAME TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------ ------------------
DEF$_AQCALL SYSTEM DEF$_AQCALL
DEF$_CALLDEST SYSTEM DEF$_CALLDEST
DEF$_SCHEDULE SYSTEM DEF$_SCHEDULE
DEF$_ERROR SYSTEM DEF$_ERROR
DEF$_DEFAULTDEST SYSTEM DEF$_DEFAULTDEST
DEF$_LOB SYSTEM DEF$_LOB
XMLDOM XDB DBMS_XMLDOM
XMLPARSER XDB DBMS_XMLPARSER
XSLPROCESSOR XDB DBMS_XSLPROCESSOR
已選擇9行。
--創建scott用戶的test表的私有同義詞(默認爲私有)
SQL> create synonym test_syn for scott.test;
同義詞已創建。
--用戶可以通過簡單的語句來查詢test表
SQL> select * from test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--連接scott用戶
SQL> connect scott/gyb860518;
已連接。
--執行查詢私有同義詞報錯
SQL> select * from test_syn;
select * from test_syn
*
第 1 行出現錯誤:
ORA-00942: 表或視圖不存在
--在sys用戶下授權給scott
SQL> grant select on test_syn to scott;
授權成功。
-在查詢私有同義詞成功
SQL> select * from sys.test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--在sys用戶下創建共有同義詞(這裏與上面的私有同義詞設爲同名,後面用到)
SQL> create public synonym test_syn for scott.test2;
同義詞已創建。
--查詢同名的同義詞,以私有同義詞優先(類似於局部變量)
SQL> select * from test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--重新創建一個共有同義詞
SQL> create public synonym test2_syn for scott.test2;
同義詞已創建。
--在scott用戶下查詢共有同義詞成功,隱藏了test2表的名稱以及它所屬的schema名
SQL> select * from test2_syn;
ID AGE
---------- ----------
001 23
--通過同義詞來更新表的數據
SQL> update test2_syn set age=24 where id='001';
已更新 1 行。
SQL> select * from test2_syn;
ID AGE
---------- ----------
001 24
--刪除同義詞
SQL> drop synonym test_syn;
同義詞已刪除。
對於同義詞我個人覺得它是不可修改的,因爲它的定義是保存在數據字典中的,而數據字典是一組只讀表的組合,不可更新。試一下看看:
--在sys用戶下查詢所有的同義詞
SQL> select synonym_name, table_owner from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ----------------------------
DEF$_AQCALL SYSTEM
DEF$_CALLDEST SYSTEM
DEF$_SCHEDULE SYSTEM
DEF$_ERROR SYSTEM
DEF$_DEFAULTDEST SYSTEM
DEF$_LOB SYSTEM
XMLDOM XDB
XMLPARSER XDB
XSLPROCESSOR XDB
TEST_SYN SCOTT
已選擇10行。
--更新scott擁有者的同義詞名
SQL> update user_synonyms set synonym_name ='haha' where table_owner='scott';
已更新0行。
SQL> select synonym_name, table_owner from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ------------------------------
DEF$_AQCALL SYSTEM
DEF$_CALLDEST SYSTEM
DEF$_SCHEDULE SYSTEM
DEF$_ERROR SYSTEM
DEF$_DEFAULTDEST SYSTEM
DEF$_LOB SYSTEM
XMLDOM XDB
XMLPARSER XDB
XSLPROCESSOR XDB
TEST_SYN SCOTT //這裏並沒有被更新
已選擇10行。
以上我的理解可能存在一定的問題,希望大家即時指正,一起討論!