SQL同义词使用

Oracle 同义词理解及使用

  • 什么是同义词

    从字面上理解,同义词其实就是一个别名,类似于视图,是一种映射关系。同义词可分为私有同义词和公有同义词两类。

  • 私有同义词:一般为普通用户自己建立的同义词,创建该同义词需要create synonym权限。该类同义词一般在创建用户的模式内使用,若其它用户想使用的话,需要以创建用户的用户名作为前缀。

    -- 创建语法
    create synonym 同义词名 for 表名;
    -- 删除同义词
    drop synonym 同义词名;
    
  • 公有同义词:一般由DBA进行创建,所有用户都可以使用,创建该同义词需要create public synonym权限。该类同义词并非模式的对象,属于各模式通用。

    -- 创建语法
    create public synonym 同义词名 for 表名;
    -- 删除同义词
    drop public synonym 同义词名;
    
  • 注意点

    • 当公有同义词与私有同义词同名时,私有同义词优先。
    • 同义词指向的对象被删除后,同义词依然存在,再次以原来的对象名创建后,同义词依旧可用。

创建同义词

  1. 创建某个用户下同义词

用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;
  1. 创建公共同义词:
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);
posted @ 2022-01-28 13:40  satire  阅读(993)  评论(0编辑  收藏  举报