Oracle synonyms總結

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行。


以上我的理解可能存在一定的問題,希望大家即時指正,一起討論!

發佈了117 篇原創文章 · 獲贊 9 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章