一. 概念
oracle 同义词从字面上理解即是别名的意思,和视图的功能类似,是一种映射关系。可以节省大量数据库空间,对不同用户的操作同一张表没有多少差别。同义词扩展了数据库的使用范围,能够在不同的数据库用户之间实现无缝交互。
同义词经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,oracle将其翻译为对应方案对象的名字。与视图一样,同义词不占用实际的存储空间,只在数据字典中保存了同义词的定义。
在oracle数据库中的大部分对象,如表,视图,物化视图,序列,包,存储过程,函数等,都可以根据实际情况为它们定义同义词。
二. 同义词分类
oracle同义词有两种类型,分别是Oracle共用同义词和私有同义词。普通用户创建的一般为私有同义词,公有同义词一般由dba创建,普通用户如果希望创建公有同义词,则需要CREATE PUBLIC SYNOYNM的权限。
1. oracle公有同义词:由一个特殊的用户组Public所拥有。数据库中所有的用户都可以使用公有同义词。公有同义词往往用来标示一些普通的数据库队形,这些对象往往大家都需要引用。
2. oracle私有同义词:与公有同义词对应,由创建它的用户所拥有。当然,这个同义词的创建者可以通过授权控制其他用户是否可以使用自己的私有同义词。
三. 同义词的作用
1. 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名,object名的形式,采用了oracle同义词之后就可以隐蔽掉user名。注意:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。
2. 简化sql语句,同时如果自己建的表名称很长,可以为这个表创建一个oracle同义词来简化sql开发。
3. 应用程序开发中可以不管数据库的具体对象名,这样在当需要调整oracle数据库对象,如表、视图、对象等,可以直接更改同义词的定义,而不需调整应用程序。
4. 避免应用程序直接访问数据库对象,提高数据库安全性。在开发应用程序的时候,应当遵守的一个规则是尽量避免直接引用数据库的表、视图、函数或其他对象,因为这会在很大程度上破坏数据库的安全性。
如果前台应用程序直接调用数据库对象,那么攻击者只需要对应用程序所引用的对象进行分析,就可以很容易的了解后台数据库的基本逻辑结构,这显然会为攻击者提供很大的便利。如果前台应用程序使用同义词来访问后台数据库,攻击者就很难通过前台应用程序的调用来分析后台数据库对象以及兑现之间的关系。
5. 在分布式系统中,为存储在远程数据库中的对象创建同义词,使用户可以像使用本地对象一样对远程对象进行操作,而不需要使用网络连接名进行限定。
四. 同义词管理
1. 用户在自己的模式下创建私有同义词,必须具有CREATE SYNONYM的权限
SQL> create synonym t1 for oracx.t;
create synonym t1 for oracx.t
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
SQL> conn /as sysdba
Connected.
SQL> grant create synonym to oracx;
Grant succeeded.
SQL> conn oracx/oracle
Connected.
SQL> create synonym t1 for oracx.t;
Synonym created.
2. 如果需要在其他模式下创建(私有)同义词,则必须具有CREATE ANY SYNONYM的权限
注意:公有同义词是和用户的schema无关的,所以创建公有同义词的时候前面不用加用户名,而私有同义词时schema的对象,创建的时候需要加用户名
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE SYNONYM
SQL> create synonym TEST.T1 for TEST.BIG_TABLE;
create synonym TEST.T1 for TEST.BIG_TABLE
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> conn / as sysdba
Connected.
SQL> grant create any synonym to oracx;
Grant succeeded.
SQL> conn oracx/oracle
Connected.
SQL> create synonym TEST.T1 FOR TEST.BIG_TABLE;
Synonym created.
3. 创建公有同义词需要CREATE PUBLIC SYNONYM权限
SQL> conn oracx/oracle;
Connected.
SQL> create public synonym big_table for TEST.BIG_TABLE;
create public synonym big_table for TEST.BIG_TABLE
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> conn / as sysdba
Connected.
SQL> grant create public synonym to oracx;
Grant succeeded.
SQL> conn oracx/oracle
Connected.
SQL> create public synonym big_table for TEST.BIG_TABLE;
Synonym created.
4. 如果要创建远程数据库上的某张表的同义词,需要先创建一个database link来扩展访问,然后再使用如下语句创建数据库同义词
create synonym table_name for user.table_name@ DB_Link
5. 查看同义词
select * from dba_synonyms where synonym_name='BIG_TABLE';
select * from user_synonyms;
注意:当使用没有指定schema的同义词时,首先在自己的schema寻找,然后在公有同义词中寻找
6. 删除同义词
SQL> drop synonym t1; --私有
Synonym dropped.
SQL> conn / as sysdba
Connected.
SQL> drop public synonym big_table; --公共同义词
Synonym dropped.
7. 编译同义词
当同义词的原对象被重新建立时,同义词需要重新编译 ALTER SYNONYM T COMPILE;
当对原对象进行DDL操作后,同义词的状态会变成INVALID;当再次应用这个同义词时,状态为变成VALIDATE,无需人工干预,当然前提是不改变原对象的名称