Oracle 同義詞理解及使用
-
什么是同義詞
從字面上理解,同義詞其實就是一個別名,類似於視圖,是一種映射關系。同義詞可分為私有同義詞和公有同義詞兩類。
-
私有同義詞:一般為普通用戶自己建立的同義詞,創建該同義詞需要create synonym權限。該類同義詞一般在創建用戶的模式內使用,若其它用戶想使用的話,需要以創建用戶的用戶名作為前綴。
-- 創建語法 create synonym 同義詞名 for 表名; -- 刪除同義詞 drop synonym 同義詞名;
-
公有同義詞:一般由DBA進行創建,所有用戶都可以使用,創建該同義詞需要create public synonym權限。該類同義詞並非模式的對象,屬於各模式通用。
-- 創建語法 create public synonym 同義詞名 for 表名; -- 刪除同義詞 drop public synonym 同義詞名;
-
注意點
- 當公有同義詞與私有同義詞同名時,私有同義詞優先。
- 同義詞指向的對象被刪除后,同義詞依然存在,再次以原來的對象名創建后,同義詞依舊可用。
創建同義詞
- 創建某個用戶下同義詞
用sys賬號給DM賬號賦予CREATE SYNONYM的權限。假設user_temp是你要建同義詞的用戶。
GRANT CREATE SYNONYM TO user_temp;
這個時候你創建同義詞的時候,如果找不到你要管理的user_res用戶下的表tableA。(注:要在user_temp用戶下創建user_res用戶下tableA表的同義詞)
這個時候還需要一個權限就是user_temp用戶select tableA的權限,這個時候是在user_res用戶下賦值的:
grant select on tableA to user_temp;
在user_temp用戶下創建同義詞:
create or replace synonym tableA for user_res.tableA;
- 創建公共同義詞:
CREATE OR REPLACE PUBLIC SYNONYM tableA for user_res.tableA;
同義詞循環鏈解決方式
錯誤代碼:ORA-01775
查看表的同義詞
SELECT * FROM ALL_SYNONYMS where table_name = 'XXXX';
查找當前用戶是否存在循環的同義詞:
select * from dba_synonyms where table_owner='XXXX' and synonym_name<>table_name;
查找同義詞沒有對象的數據庫對象
select * from dba_synonyms where table_owner = 'XXXX' and synonym_name in
(select a.synonym_name from dba_synonyms a where a.table_owner = 'XXXX' minus select object_name from user_objects);