SQL同义词使用
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);