Oracle synonyms總結

lygle發表於2014-04-22

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


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

    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28673746/viewspace-1147203/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章