私有同义词: 一般为普通用户自己建立的同义词,创建该同义词需要 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);