Oracle创建同义词

314 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、定义

oracle的同义词从字面上理解是别名的意思,和视图的功能类似,就是一种映射关系。在使用同义词时,oracle数据库将他翻译成对应方案对象的名字。与视图对象类似,同义词不占用实际存储空间,只有在数据字典中保存了同义词的定义。在oracle数据库中的大部分数据库对象,如表,视图,物化视图,序列,函数,存储过程,包同义词等,数据库管理员都可以根据实际情况为他们定义同义词。

Oracle对象知识:同义词(Synonym)创建删除,同义词(Synonym)是数据库对象的一个别名,Oracle可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:

私有同义词:拥有CREATE SYNONYM权限的用户(包括非管理员用户)即可创建私有同义词,创建的私有同义词只能由当前用户(创建者用户)使用。

公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。(注:公有同义词在同一实例下的所有用户都是可以访问的)

290c298739b35c615929a461c6b7019b_20210611155916827.png

二、同义词种类

oracle有两种类型同义词,分别是oracle公用同义词与私有同义词。

普通用户创建的同义词一般是私有同义词,公用同义词一般有DBA(数据库管理员(Database Administrator,简称DBA))创建,普通用户如果希望创建同义词,则需要create public synonym这个系统权限。

1)、oracle公用同义词:由一个特殊的用户组public所拥有。顾名思义,数据库所有的用户都可以使用公用同义词。公用同义词用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。

2)、oracle私有同义词:它是跟公用同义词所对应,他是由创建他的用户所有,当然,这个同义词的创建者可以通过授权控制其他用户是否有权使用自己的私有同义词。

三、同义词的好处

1、不占内存空间,节省大量的数据库空间

2、简化了数据库对象的访问

3、提高了数据库对象访问的安全性

4、扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;同义词可以创建在不同一个数据库服务器上,通过网络实现连接

四、同义词的 作用

  1. 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。

  2. 为用户简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。

  3. 为分布式数据库的远程对象提供位置透明性。

  4. Oracle同义词在数据库链接中的作用

数据库链接是一个命名的对象,说明一个数据库到另一个数据库的路径,通过其可以实现不同数据库之间的通信。

五、赋予权限,创建同义词的时候还需要赋于相关的权限:

用sys账号给test账号授予CREATE [PUBLIC] SYNONYM的权限

--授予权限私有同义词:
Grant create synonym to username; --为用户创建同义词的权限
Grant create any synonym to username; --为任意用户创建同义词的权限
 
--授予权限公有同义词:
Grant create public synonym to username;
 
--删除私有同义词需要有DROP ANY SYNONYM权限。(如果有drop any table则不用drop any synonym权限也可以删除)
Grant drop any synonym to username;
 
--删除公有同义词需要有DROP PUBLIC SYNONYM权限。
Grant drop public synonym to username;
 
--查看当前用户权限的方式
select * from user_sys_privs;
--查看所有用户权限的方式
select * from dba_sys_privs;
 
--查看当前用户表权限的方式
select * from user_tab_privs;
--查看所有表权限的方式,用于查看同义词对应的表
select * from all_tab_privs;
--查看所有表权限的方式包括,用于查看同义词对应的表
select * from dba_tab_privs;
 
--oracle查询角色
--1、查看所有角色:
select * from dba_roles;
--2、查看当前用户所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;

六、查看同义词的语法是:

--查看所有同义词:
select * from dba_synonyms;
Select * from all_synonyms;
--查看当前用户的同义词
select * from user_synonyms;
--查询结果及含义
Owner,synonym_name,table_owner,table_name,db_link;
(同义词所有者的用户名),(同义词的名称),(同义词引用的对象的所有者),(同义词引用的对象的名称),(远程同义词中引用的数据库链接的名称)

七、创建同义词的语法是:

--创建公有Oracle同义词的语法:
Create [public] synonym 同义词名称 for [username.]objectName;
例如:create public synonym table_a for user.table_a;
 
--创建私有Oracle同义词的语法:
Create synonym 同义词名称 for [username.]objectName;
例如:create synonym table_b for user.table_b;

注意事项:如果只创建同义词而没有给指定用户的表或者视图授予select(只读)权限,那么当前用户(同义词所在用户)不会有当前表查询的权限。可通过查看当前用户表权限的方式
select * from user_tab_privs;

给指定用户的表或者视图授予select(只读)权限。
例子一:grant select on 拥有者.表名 to username; —拥有者指原数据库表的拥有者,不用用username给自己赋权限,不然会报:ORA-01749:you may not GRANT/REVOKE privileges to/from yourself。你不可以授予或撤销自己的权限 

例子二:grant select on UserB.Table1 to UserA;--UserB用户为表拥有者,UserA为同义词拥有者

问题1:请问SQL中 我创建一个用户后只授予了他一个Select权限可是为什么其他操作还是可以做

解答:可以通过select * from dba_role_privs;查看当前用户所拥有的角色。是否授予了他角色,比如说dba角色之类的

八、同义词的删除语法

因为同义词也是对象 ,删除语法同表一样

Drop [public] synonym 同义词名称
-- 删除公有同义词:
drop public synonym table_a;
 
-- 删除私有同义词:
drop synonym table_b;