Oracle中的同义词SYNONYM

同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的SQL语句复杂度。

同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。

你可以创建公共同义词和私有同义词。其中,公共同义词属于PUBLIC特殊用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中,只允许特定用户或者有基对象访问权限的用户进行访问。

同义词本身不涉及安全,当你赋予一个同义词对象权限时,你实质上是在给同义词的基对象赋予权限,同义词只是基对象的一个别名。

 

创建同义词

在你自己的方案中创建私有同义词时,你必须拥有CREATE SYNONYM权限;在其他方案中创建私有同义词时,你必须拥有CREATE ANY SYNONYM权限;创建公共同义词,你必须拥有CREATE PUBLIC SYNONYM系统权限。

我们通过CREATE SYNONYM语句来创建一个同义词,需要注意的是,为了成功创建同义词,我们既不需要基对象一定存在,也不需要拥有访问基对象的权限。下面的语句创建了jward用户下emp表的公共同义词public_emp

 

点击(此处)折叠或打开

  1. CREATE PUBLIC SYNONYM public_emp FOR jward.emp


当你为远程的过程或者函数创建同义词时,你必须限定远程对象的方案名称;相应的,你可以为驻留在本地数据库的远程对象创建本地公共同义词,在这种情况下,在后续调用存储过程或者函数时必须包含数据库链接。

 

DML语句中使用同义词

你可以使用方案内部的所有私有同义词;另外,只要你拥有访问基对象的必要权限,或者明确地通过特定角色,再或者通过PUBLIC,你就可以访问任意的公共同义词。你也可以访问其他方案的私有同义词,前提是你被赋予了访问相应基对象的权限。

只要你被赋予了基对象权限,你就可以使用其他用户的私有同义词。例如,你只拥有jward.emp表的SELECT权限,jward.emp表有一个同义词jward.employee,这时,你就只能对jward.employee同义词进行查询操作,而不能使用它进行插入数据。

DML语句中,同义词的使用方式和基对象的使用方式完全相同。例如,一个名称为employee的同义词,下面语句是有效的:

点击(此处)折叠或打开

  1. INSERT INTO employee (empno, ename, job)
  2.     VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');


如果fire_emp是一个独立的程序或程序包的同义词,你就可以执行以下命令:


点击(此处)折叠或打开

  1. EXECUTE Fire_emp(7344);



删除同义词
       你可以删除本方案中的任一私有同义词;如果你要删除其他用户方案的私有同义词,你必须拥有DROP ANY SYNONYM系统权限;如果你要删除公共同义词,你必须拥有DROP PUBLIC SYNONYM系统权限。

你可以通过DROP SYNONYM语句来删除一个不再需要的同义词,当删除私有同义词时,省略PUBLIC关键字;当删除公共同义词时,需要包含PUBLIC关键字。

例如,下面语句删除名为emp的同义词:

 

点击(此处)折叠或打开

  1. DROP SYNONYM emp;

下面的语句删除名为public_emp的公共同义词:

 

点击(此处)折叠或打开

  1. DROP PUBLIC SYNONYM public_emp;

当你删除一个同义词时,它的定义就会从数据字典中移除。与此同时,与之相关的所有对象依然存在,但是,他们的状态都变为无效(不可用)。
请使用浏览器的分享功能分享到微信等