【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程序員面試筆試寶典》,作者:李華榮。