Oracle資料庫物件_同義字

來源:互聯網
上載者:User

Oracle資料庫物件_同義字

同義字是一種資料庫物件,它是為一個資料庫物件定義的別名,使用同義字的主要目的是為了簡化SQL語句的書寫。

同義字的概念和類型

利用同義字可以為使用者的一個對象,或者其他使用者的一個對象定義別名,從而簡化命令或程式的書寫,在命令或程式中可以直接使用同義字代替原來的對象。

可以為表、視圖、儲存程式、序列等對象建立同義字,也可以為一個同義字再建立同義字,甚至可以為一個不存在的對象建立同義字,系統僅僅在使用同義字時才驗證它所代表的對象是否存在。
同義字本身並不包含原對象中的資料或代碼,它的作用僅僅相當於一個指標。

在使用同義字時,系統根據同義字的定義尋找它所指向的對象,將對同義字的訪問轉化為對原對象的訪問。
同義字的作用僅僅是為了方便使用者操作資料庫對象。

Oracle支援兩種類型的同義字,即私人同義字和公用同義字。

私人同義字由普通使用者建立,在預設情況下只能由使用者本人使用。
公有同義字一般由DBA建立,可以由所有使用者使用。

公用同義字的意義在於它代表了一個大家都可以訪問的對象。

註:普通使用者如果要訪問公有同義字,需要具有對同義字所指向的原對象的存取權限。

一般來說,在具有相關資料庫物件的許可權後,即可進行相關的操作,但如果定義了同義字,就可以簡化SQL語句的書寫。

比如在訪問其他使用者模式下的資料庫物件時,便可以省略對象前的模式名稱。

使用者可以隨意為其他使用者的一個對象建立一個同義字,但這並不意味著這個使用者就具有了訪問其他使用者的對象的許可權。

因為正如前面所提到的,只有在使用同義字時,系統才驗證使用者是否有相應的存取權限。

例如:

create synonym emp for scott.emp;

select * from emp;

註:以普通使用者身份在scott使用者模式下為資料庫物件emp建立同義字emp。

在沒有存取權限的情況下,提示錯誤:ORA-00942: 表或視圖不存在。

在考慮另一種情況,就是為不存在的對象建立同義字:

create synonym em for scott.em;

select * from em;

在使用同義字em訪問來源物件時,提示錯誤:ORA-00980: 同義字轉換不再有效。

同義字的建立和刪除

使用者可以在自己的模式中建立同義字,這時需要具有CREATE SYNONYM這個系統許可權。
如果希望在其他使用者的模式中建立同義字,則需要具有CREATE ANY SYNONYM這個系統許可權。

普通使用者如果希望建立公有同義字,需要具有CREATE PUBLIC SYNONYM系統許可權。

建立私人同義字的命令是CREATE SYNONYM ,它的文法規則為:

CREATE SYNONYM 同義字 FOR 使用者名稱.對象名;

建立公有同義字的文法格式為:

CREATE SYNONYM 同義字 FOR 使用者名稱.對象名;

註:這裡的使用者名稱.對象名是指其他使用者模式,因為一般在建立同義字時,是為了方便訪問其他使用者模式下的對象。

當然也可以在自己模式下建立同義字,對於普通使用者而言,如果是建立私人同義字是沒有什麼意義的。

對於公有同義字而言,普通使用者和DBA許可權使用者都可以在自己使用者模式下,建立公有同義字,這樣可以方便其他使用者對該資料庫物件的訪問。

比如DBA許可權使用者建立v$開頭的有關動態效能檢視的公有同義字。

使用者如果不使用同義字時,可以將其刪除。

刪除同義字的命令是DROP SYNONYM,這條命令的文法格式為:
DROP SYNONYM 同義字名;

註:如果要刪除公有同義字的話,要在關鍵字SYNONYM之前加上關鍵字PUBLIC。

一個使用者可以刪除自己建立的同義字,如果要刪除其他使用者建立的同義字,則要具有DROP ANY SYNONYM 系統許可權。
DBA 可以刪除所有的公用同義字,普通使用者需要具有DROP PUBLIC SYNONYM系統許可權,才能刪除公用同義字。
同義字被刪除以後,它的相關資訊也將從資料字典中刪除。

註:對於普通使用者而言,即使是自己建立的公有同義字,仍需要具有DROP PUBLIC SYNONYM系統許可權,才能刪除自己建立的同義字。

 

同義字資訊的查詢

同義字作為一種資料庫物件,它的相關資訊被儲存在資料字典中。

與同義字有關的資料字典有三個: user_synonyms 、all_synonyms 、dba_synonyms。

其中在資料字典user_synonyms 中記錄了目前使用者所擁有的同義字。這個表的各列定義及其意義如下所示:

SYNONYM_NAME 同義字名稱

TABLE_OWNER 所指向的對象屬主

TABLE_NAME 所指向對象的名稱

DB_LINK 資料庫連結

註:DB_LINK 列是指在建立同義字SYNONYM時,TABLE_NAME 是通過DBLINK獲得的。

如果要查詢目前使用者建立了哪些同義字,它們各代表哪個使用者的哪個對象,可以執行下面的SELECT語句進行查詢:
SELECT synonym_name, table_owner, table_name FROM user_synonyms;

在資料字典all_synonyms 中記錄了目前使用者所能使用的所有同義字,包括私人同義字和公用同義字。
在資料字典dba_synonyms 中記錄了資料庫中所有的同義字,包括每個使用者建立的私人同義字和DBA 建立的公用同義字。
這個視圖只有DBA 能夠訪問,它的結構除了包含資料字典user synonyms的所有列外,還有一個列owner代表同義字的建立者。
如果要在整個資料庫範圍內查詢某個同義字的資訊,可以對資料字典dba_synonyms進行查詢。
例如,要查詢使用者scott所建立的所有同義字,可以執行下面的SELECT語句:

SELECT synonym_name, table_owner, table_name FROM dba_synonyms WHERE owner='SCOTT';

如果要查詢使用者scott的表dept具有哪些同義字,可以執行下面的SELECT語句:

SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner='SCOTT' AND table_name='EMP';

如果要查詢系統中所有的公用同義字,可以執行下面的SELECT語句:

SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner='PUBLIC';

註:table_owner和owner之前的區別:

table_owner是指同義字所指向資料庫物件的屬主,一般就是指該對象的建立者,而owner是指同義字的建立者。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.