【DB筆試面試514】在Oracle中,同義詞的定義及其作用是什麼?有關同義詞需要注意些什麼?
- 2019 年 10 月 8 日
- 筆記
♣
題目部分
在Oracle中,同義詞的定義及其作用是什麼?有關同義詞需要注意些什麼?
♣
答案部分
同義詞是其它對象(例如表、實體、存儲過程、函數、包、序列)的別名。同義詞也可以是另一個同義詞的別名。同義詞的優點主要體現在以下幾個方面:
l 當使用對象時,不需要指出對象的所有者。
l 引用對象不需要指出它所在的數據庫。
創建同義詞必須要有 CREATE ANY SYNONYM、CREATE SYNONYM 系統權限。要創建全局的同義詞,必須有CREATE PUBLIC SYNONYN 系統權限。創建同義詞的語法如下所示:
CREATE OR REPLACE [PUBLIC ] SYNONYM 同義詞名稱 FOR 用戶名.表名稱;
以下示例的作用是將EMP定義為SCOTT.EMP的同義詞。
SYS@lhrdb> SELECT COUNT(1) FROM EMP; SELECT COUNT(1) FROM EMP * ERROR at line 1: ORA-00942: table or view does not exist SYS@lhrdb> CREATE SYNONYM EMP FOR SCOTT.EMP; Synonym created. SYS@lhrdb> SELECT COUNT(1) FROM EMP; COUNT(1) ---------- 14
有關同義詞需要注意的幾點如下所示:
① 公共同義詞與私有同義詞可以同名。如果存在公共同義詞和私有同義詞同名的情況,那麼在訪問同義詞時,訪問的是私有同義詞所指向的對象。
② 不能創建和當前用戶下的表名相同的私有同義詞,但是可以創建和當前用戶下的表名相同的公共同義詞。
測試如下:
LHR@ora11g > create table s_b as select * from dual; Table created. LHR@ora11g > create synonym s_b for s_b; create synonym s_b for s_b * ERROR at line 1: ORA-01471: cannot create a synonym with same name as object LHR@ora11g > create public synonym s_b for s_b; Synonym created.
③ 不能訪問與當前用戶下的表名相同的公共同義詞。Oracle選擇訪問對象的順序原則是先SCHEMA後PUBLIC。通過訪問同義詞就相當於訪問其他SCHEMA對象的表,但是,當創建的同義詞和其他對象重名的時候,有可能在查詢時卻指向了另一個同名的對象,導致無法訪問到正確的數據。
測試如下:
LHR@ora11g > create table s_a (name varchar2(10)); Table created. LHR@ora11g > create table s_b as select * from dual; Table created. LHR@ora11g > create public synonym s_a for s_b; Synonym created. LHR@ora11g > select * from s_a; no rows selected LHR@ora11g > set line 9999 LHR@ora11g > col OBJECT_NAME format a10 LHR@ora11g > select owner,object_name,object_type FROM dba_objects where object_name='S_A'; OWNER OBJECT_NAM OBJECT_TYPE ------------------------------ ---------- ------------------- PUBLIC S_A SYNONYM LHR S_A TABLE LHR@ora11g > LHR@ora11g > create synonym s_b for s_b; create synonym s_b for s_b * ERROR at line 1: ORA-01471: cannot create a synonym with same name as object LHR@ora11g > create public synonym s_b for s_b; Synonym created.
以上實驗也證明了,Oracle選擇訪問對象的順序原則是先SCHEMA後PUBLIC。
& 說明:
有關Oracle同義詞的更多內容介紹可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2154285/
本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。