摘自《從實踐中學習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 同義詞的名字;