一、介紹
Oracle的同義詞(synonyms)從字面上理解就是別名的意思,和視圖的功能類似,就是一種映射關系。它可以節省大量的數據庫空間,對不同用戶的操作同一張表沒有多少差別;它擴展了數據庫的使用范圍,能夠在不同的數據庫用戶之間實現無縫交互。
很多時候,會有多個oracle賬號訪問一個賬號下的表,比如:USER_A用戶下面有很多表,相關的sql語句都是USER_A.Tablename等等等,這時候需要用USER_B用戶去訪問USER_A的表,但是sql語句還要保持USER_A.Tablename,就需要用到同義詞了
同義詞分類:
Oracle同義詞有兩種類型,分別是Oracle公用同義詞與Oracle私有同義詞。普通用戶創建的同義詞一般都是私有同義詞,公有同義詞一般由DBA創建,普通用戶如果希望創建同義詞,則需要CREATE PUBLIC SYNONYM這個系統權限。
-
Oracle公用同義詞:由一個特殊的用戶組Public所擁有。顧名思義,數據庫中所有的用戶都可以使用公用同義詞。公用同義詞往往用來標示一些比較普通的數據庫對象,這些對象往往大家都需要引用。
-
Oracle私有同義詞:它是跟公用同義詞所對應,他是由創建他的用戶所有。當然,這個同義詞的創建者,可以通過授權控制其他用戶是否有權使用屬於自己的私有同義詞。
二、創建同義詞
語法:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [ schema.] 同義詞名稱 FOR [ schema.] object [ @dblink ];
專有(私有)同義詞
CREATE SYNONYM SYSN_TEST FOR TEST;
公共同義詞
CREATE PUBLIC SYNONYM PUBLIC_TEST FOR TEST;
2.1首先需要sys用戶授權USER_B創建同義詞權限
其中USER_B是需要創建同義詞的用戶
GRANT CREATE SYNONYM TO USER_B;
這個時候還需要一個權限就是USER_B用戶select USER_A用戶table的權限,這個時候是在USER_A用戶下賦值的
grant select on tableA to user_temp;
2.2創建同義詞
create synonym USER_B.Tablename for USER_A.Tablename;
2.3測試同義詞
使用USER_B用戶oracle,有輸出結果代表可以在USER_B用戶下以USER_B的schema查看USER_A的表
select count(*) from USER_B.Tablename;
三、批量創建同義詞
很多時候,當前環境下的表有幾百張甚至幾千張,很多人說可以select * from dba_tables where owner='UPCENTER' 把表名查出來,用notpad拼成命令,批量執行,這里是行不通的,因為每條命令的行尾都不一樣(表名不同)
這時候可以先用notpad軟件把USER_B用戶select USER_A用戶table的權限批量執行,然后再執行下面的命令,把輸出結果執行以下即可:
select 'create synonym USER_B.'||table_name||' for upcenter.'||table_name||';' from dba_tables where owner='USER_A'
四、查看同義詞和刪除同義詞
4.1查看用戶下的同義詞
SELECT * FROM DBA_SYNONYMS where OWNER = 'UPAPP';
4.2刪除同義詞
DROP SYNONYM SYSN_NAME;