詳解同義詞(synonym)

pingley發表於2012-02-08
詳解同義詞(synonym)
synonym(同義詞):是一張表,檢視,序列,函式等資料庫物件的別名。同義詞依賴於目標物件
如果目標物件被刪除或者該表了,同名就無效了。同義詞提供了資料獨立性位置無關性。運用
程式不必知道使用的同義詞所依賴的物件的名字,在那個表空間等。但是使用者使用別名也需要
獲得相應的授權。以使用同義詞標識的目標物件。

private synonym:存在於某個使用者的模式中,只能為該使用者訪問或者獲得授權可以訪問
同義詞所依賴的物件的使用者。
public synonym:該同義詞對資料庫中所有使用者都可用。

在自己的schema建立private synonym需要create synonym特權。
在其他的schema建立private synonym需要create any synonym特權。
建立public synonym需要create public synonym特權。


語法格式:
create [ or replace ] [ public ] synonym_name
   [ schema. ] synonym_name
   for [ schema. ] object [ @ dblink ] ;

建立,使用,刪除public synonym
SQL> desc scott.acctmanager
Name    Type         Nullable Default Comments 
------- ------------ -------- ------- -------- 
AMID    CHAR(4)                                
AMFIRST VARCHAR2(12)                           
AMLAST  VARCHAR2(12)                           
AMEDATE DATE         Y        SYSDATE          
AMSAL   NUMBER(8,2)  Y                         
AMCOMM  NUMBER(7,2)  Y        0                
REGION  CHAR(2)      Y                
SQL> create public synonym manager for scott.acctmanager;
同義詞已建立。
SQL> conn hr/hr
已連線。
SQL> select * from manager;
select * from manager
              *
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在
因為不沒有對同義詞所依賴的物件的訪問許可權。
SQL> conn scott
輸入口令:
已連線。
SQL> grant all on acctmanager to hr;
授權成功。
給hr使用者授予對錶acctmanager 的所有許可權。
SQL> conn hr/hr
已連線。
SQL> select count(*) from manager;

  COUNT(*)
----------
         1
SQL> delete from manager;
已刪除 1 行。
使用同義詞執行DML操作。
SQL> rollback;
回退已完成。
SQL> conn scott/TIGER
已連線。
再次切換到scott使用者,撤銷所有對物件acctmanager的操作許可權。
SQL> revoke all on acctmanager from hr;
撤銷成功。

授權給hr使用者對同義詞manager所有的操作許可權。
SQL> grant all on manager to hr;
授權成功。
SQL> conn hr/hr
已連線。
SQL> update manager
  2  set amsal=7000
  3  where amid='0001';
已更新 1 行。
從上面可以看出對同義詞相應授權就是對同義詞所依賴的目標物件的授權。
SQL> conn system as sysdba
輸入口令:
已連線。
SQL> drop synonym manager;
drop synonym manager
             *
第 1 行出現錯誤:
ORA-01434: 要刪除的專用同義詞不存在
刪除public synonym的時候需要新增關鍵字public 
SQL> drop public synonym manager;
同義詞已刪除。

建立,使用,刪除private synonym


SQL> conn hr/hr
已連線。
SQL> create synonym emp for employees;
同義詞已建立。
把emp所依賴的目標的所有操作特權授予scott使用者。
SQL> grant all on emp to scott;
授權成功。
SQL> conn scott/TIGER
已連線。
SQL> select count(*)
  2  from emp;
from emp
     *
第 2 行出現錯誤:
ORA-00942: 表或檢視不存在
SQL> select count(*)
  2  from hr.emp;

  COUNT(*)
----------
       107
因為emp是private synonym需要新增shema字首。

使用同義詞執行DML操作。
SQL> update hr.emp
  2  set salary=30000
  3  where employee_id=100;
已更新 1 行。
SQL> conn hr/hr
已連線。
SQL> drop synonym emp;
同義詞已刪除。
刪除private synonym與刪除public synonym的方式不同。

在oracle中使用同義詞尋找物件的步驟是:
1、首先查詢與同義詞同名的物件是否存在於當前的shema中。
2、根據給定的同義詞查詢私有同義詞是否存在於當前的shema中。
3、如果私有同義詞沒有找到,根據給定的同義詞查詢公有同義詞。
4、如果沒有找到公有同義詞,oracle資料庫會報錯。

SQL> conn system as sysdba
輸入口令:
已連線。
SQL> create public synonym people for scott.acctmanager;
同義詞已建立
SQL> grant all on people to hr;
授權成功。
SQL> conn hr/hr
已連線。
SQL> create table people(id char(12),name varchar2(30),sex char(1) check (sex in ('f','m')));
表已建立。
SQL> insert into people values('0001','zhangsan','m');
已建立 1 行。
SQL> select count(*) from people;
  COUNT(*)
----------
         1
從上面兩條sql語句可以證明:首先查詢與同義詞同名的物件是否存在於當前的shema中。


SQL> drop table people;
表已刪除。
SQL> select count(*)
  2  from people;
  COUNT(*)
----------
         1
SQL> create synonym people for employees;
同義詞已建立。
SQL> select count(*) from people;
  COUNT(*)
----------
       107
注:hr 中的employees中有107條記錄。
從上面的一段sql語句可以證明:
如果私有同義詞在當前shema中沒有找到,根據給定的同義詞查詢公有同義詞。
根據給定的同義詞查詢私有同義詞是否存在於當前的shema中。
SQL> drop public synonym people;
同義詞已刪除。
SQL> select count(*) from people;
select count(*) from people
                     *
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在
從上面的sql語句可以證明:
如果沒有找到公有同義詞,oracle資料庫會報錯。

另外同義詞不可以濫用,不然容易引起物件名的混亂。可以使用資料字典dba_synonyms
查詢有關同義詞的相關資訊:
SQL> desc dba_synonyms
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 SYNONYM_NAME                              NOT NULL VARCHAR2(30)
 TABLE_OWNER                                        VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 DB_LINK                                            VARCHAR2(128)

SQL> create synonym manager for  scott.acctmanager;
同義詞已建立。
SQL> select * from dba_synonyms
  2  where synonym_name='MANAGER';
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK
------------------------------ ------------------------------ ------------------------------ ------------------------------ --------------------------------------------------------------------------------
SYSTEM                         MANAGER                        SCOTT                          ACCTMANAGER                    

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

相關文章