創建使用Oracle同義詞

摘自《從實踐中學習Oracle/SQL》清華大學出版社出版。

 

設定同義詞,方便使用

 

SQL

 

select * from emp;等用於select * from abc;

 

建立共有的同義詞

 

SQL

 

如果用戶的等級不夠建立public同義詞,可以在system下授權:

 

grant create any synonym to scott;

 

grant create public synonym to scott;

 

取消授權:

 

revoke create any synoym from scott;

 

revoke create public synoym from scott;

 

取消同義詞:

 

drop public synonym abc;

 

授權取消同義詞:

 

grant dorp public synonym to scott;

 

取消授權:

 

revoke drop public synonym to scott;

 

 

15.9 引入同義詞(Synonym)的原因

在一些商業數據庫中,有時信息系統的設計或開發者爲了增加易讀性,故意定義一些很長的表名(也可能是其它的對象)。這樣雖然增加了易讀性,但在引用這些表或對象時就不那麼方便,也容易產生輸入錯誤。另外在實際的商業公司裏,一些用戶覺得某一個對象名有意義也很好記,但另一些用戶可能覺得另一個名字更有意義。

ORACLE系統提供的同義詞(Synonym)就是用來解決以上的難題的。設想一下在您的日常工作中您每天都要使用supplier表許多次,而且您的英文打字的水平並不高。在這種情形下,您就可以藉助於同義詞(Synonym)來幫助您提高生產力。

15.10 怎樣創建同義詞(Synonym)

現在您就可以使用如下的CREATE SYNONYM語句(例15-38)爲表supplier建了一個同義詞(別名)s

 

15-38

SQL> CREATE SYNONYM s

2 FOR supplier;

15-38結果

同義詞已創建。

 

現在您就可以把同義詞(別名)s當成supplier來使用。您可以使用如下的查尋語句(例15-39)來驗證這一點。

 

15-39

SQL> SELECT *

2 FROM s;

15-39結果

S_CODE SNAME CONTACT PHONE FAX

---------- ------------------------- --------------- --------------- -------

2000 仙客來百貨張根發 4444944 4444844

2010 心太軟小商品石鐵心 1741741 1741742

2021 食爲天餐具金元寶 1671671 1671674

2032 食爲先餐具陸合彩 1681684 1681684

 

那您可能會問,您怎樣才能知道您到底擁有哪些同義詞(Synonym)呢?

還記得數據字典user_objects嗎?既然同義詞(Synonym)是對象,它們在這個數據字典中就一定有記載。因此您可以使用如下的查尋語句(例 15-41)從數據字典user_objects中得到您所擁有的全部同義詞(Synonym)的信息。當然爲了使SQL*PLUS的顯示輸出更加清晰您應該先使用如下的SQL*PLUS格式化命令(例15-40)。

 

15-40

SQL> col object_name for a20

15-41

SQL> SELECT object_name, object_type, created, status

2 FROM user_objects

3 WHERE object_type LIKE 'SYN%';

 

15-41結果

OBJECT_NAME OBJECT_TYPE CREATED STATUS

-------------------- ------------------ ---------- ------

S SYNONYM 28-4 -03 VALID

 

15-41顯示的結果表明:在您的模式(用戶)下只有一個同義詞(Synonym),那就是您剛剛建立的同義詞(Synonym)s

但是例15-41顯示的結果並沒有告訴您這個同義詞(Synonym)到底是基於那個表的及表的主人是誰。如果您有一個這樣同義詞(Synonym)時,這方面的信息也許就顯得特別重要了。您可以使用如下的查尋語句(例15-43)從數據字典user_synonyms中得到這方面的信息。當然爲了使 SQL*PLUS的顯示輸出更加清晰您應該先使用如下的SQL*PLUS格式化命令(例15-42)。

 

15-42

SQL> col table_owner for a12

SQL> col table_name for a12

 

15-43

SQL> SELECT synonym_name, table_owner, table_name

2 FROM user_synonyms;

15-43結果

SYNONYM_NAME TABLE_OWNER TABLE_NAME

------------------------------ ------------ ----------

S SCOTT SUPPLIER

 

15-43顯示的結果表明:在您的模式(用戶)下只有一個同義詞(Synonym),那就是您剛剛建立的同義詞(Synonym)s。該同義詞(Synonym)是基於表supplier,而這個表的主人是SCOTT

 

創建同義詞(Synonym)的語句格式如下:

 

CREATE [PUBLIC] SYNONYM 同義詞的名字

FOR 對象名;

 

其中:

 

Ø PUBLIC:系統中所有的用戶都可以訪問所創建的同義詞

Ø 同義詞的名字:所創建的同義詞的名字

Ø 對象名:創建的同義詞所基於的對象名

在創建同義詞時要注意的事項:

 

Ø 所基於的對象不能包含在任何軟件包中

Ø 一個私有的同義詞不能與任何該用戶下的其它對象重名

 

您剛剛創建的同義詞(Synonym)s是一個私有的同義詞,即只能在您的用戶(SCOTT)下直接引用,如果其它用戶引用它就必需冠以用戶名.(既 scott.s的方式引用)。這樣作很不方便。如果您所建的表supplier是一個所有用戶共享並經常使用的表,您應該怎樣處理這一問題呢?

15.11 創建公用同義詞(Synonym)

您可以爲supplier表創建一個公用同義詞(Synonym)。爲了演示方便,您應該從當前的SCOTT用戶切換到另一個用戶下,如SYSTEM。您可以使用如下的SQL*PLUS命令(例15-44)來完成用戶的切換。

 

15-44

SQL> CONNECT SYSTEM/MANAGER

15-44結果

已連接。

 

現在您如果使用如下的查尋語句(例15-45),您是不會得到您想要的信息的。

 

15-45

SQL> SELECT *

2 FROM s;

15-45結果

FROM s

*

ERROR 位於第 2 :

ORA-00942: 表或視圖不存在

 

您如果再使用如下的查尋語句(例15-46),您也同樣不會得到您想要的信息的。

 

15-46

SQL> SELECT *

2 FROM supplier;

15-46結果

FROM supplier

*

ERROR 位於第 2 :

ORA-00942: 表或視圖不存在

 

 

如果您在同義詞(Synonym)s之前冠以用戶名.scott.),您就可以得到您所需要的信息了。如下面的查尋語句(例15-47)。

 

15-47

SQL> SELECT *

2 FROM scott.s;

15-47結果

S_CODE SNAME CONTACT PHONE FAX

---------- ------------------------- --------------- --------------- -------

2000 仙客來百貨張根發 4444944 4444844

2010 心太軟小商品石鐵心 1741741 1741742

2021 食爲天餐具金元寶 1671671 1671674

2032 食爲先餐具陸合彩 1681684 1681684

由於其它用戶在引用這一同義詞(Synonym)s時必須冠以您的用戶名(..,這樣很不方便,而且也容易產生輸入錯誤,所以您可以使用如下的DDL語句(例15-48)爲scott用戶下的supplier建立一個公用的同義詞(Synonym)ss

 

15-48

SQL> CREATE PUBLIC SYNONYM ss

2 FOR scott.supplier;

 

15-48結果

同義詞已創建。

 

現在您就可以利用您剛剛創建的公用的同義詞(Synonym)ss來獲得您所希望得到的信息。您可以使用如下的查尋語句(例15-49)。

 

15-49

SQL> SELECT *

2 FROM ss;

 

15-49結果

S_CODE SNAME CONTACT PHONE FAX

---------- ------------------------- --------------- --------------- -------

2000 仙客來百貨張根發 4444944 4444844

2010 心太軟小商品石鐵心 1741741 1741742

2021 食爲天餐具金元寶 1671671 1671674

2032 食爲先餐具陸合彩 1681684 1681684

 

您也可能會問,其它用戶是否也可以使用同樣的方法訪問同義詞(Synonym)ss。答案是肯定的。如果您還有疑問的話,您可以試着以如下的SQL*PLUS命令(例15-50)以SYS用戶登錄進入ORACLE數據庫。

 

 

15-50

SQL> CONNECT SYS/ORACLE AS SYSDBA;

15-50結果

已連接。

 

現在您就可以利用公共同義詞(Synonym)ss來獲得您所希望得到的信息。您可以使用如下的查尋語句(例15-51)。

 

15-51

SQL> SELECT *

2 FROM ss;

15-51結果

S_CODE SNAME CONTACT PHONE FAX

---------- ------------------------- --------------- --------------- -------

2000 仙客來百貨張根發 4444944 4444844

2010 心太軟小商品石鐵心 1741741 1741742

2021 食爲天餐具金元寶 1671671 1671674

2032 食爲先餐具陸合彩 1681684 1681684

 

ORACLE並沒有提供修改同義詞(Synonym)的命令。如果您要修改某一同義詞(Synonym)的話,您要先把它刪除掉,之後再重新建立這個同義詞(Synonym)

15.12 刪除同義詞(Synonym)

如果經過了一段時間,您發現同義詞(Synonym)s已經沒什麼用處了,您就可以使用如下的DDL語句(例15-53)將它刪除掉。不過在這之前您可能得先使用如下的SQL*PLUS命令(例15-52)重新註冊到SCOTT用戶下。

 

15-52

SQL> CONNECT SCOTT/TIGER

15-52結果

已連接。

 

15-53

SQL> DROP SYNONYM s;

15-53結果

同義詞已丟棄。

 

雖然例15-53結果已經顯示:“同義詞已丟棄。”,但是爲了謹慎起見,您還是應該使用如下的查尋語句(例15-54)查看一下數據字典user_objects

 

 

 

 

15-54

SQL> SELECT object_name, object_type, created, status

2 FROM user_objects

3 WHERE object_type LIKE 'SYN%';

15-54結果

未選定行

 

或者您應該使用如下的查尋語句(例15-55)查看一下數據字典user_ synonyms

 

15-55

SQL> SELECT synonym_name, table_owner, table_name

2 FROM user_synonyms;

15-55結果

未選定行

 

15-54和例15-55顯示的結果進一步證實了您已經將同義詞(Synonym)s成功地從系統中刪除掉。

 

刪除同義詞(Synonym)語句的格式如下:

 

DROP SYNONYM 同義詞的名字;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章