共计 2759 个字符,预计需要花费 7 分钟才能阅读完成。
同义词是一种 数据库对象 ,它是 为一个数据库对象定义的别名 ,使用同义词的主要目的是为了 简化 SQL 语句的书写。
同义词的概念和类型
利用同义词可以为用户的一个对象,或者 其他用户 的一个对象定义别名,从而 简化命令或程序的书写 ,在命令或程序中可以 直接使用同义词代替原来的对象。
可以为 表、视图、存储程序、序列等对象 建立同义词,也可以 为一个同义词再建立同义词 ,甚至可以为一个 不存在的对象建立同义词 ,系统仅仅在 使用同义词时才验证它所代表的对象是否存 在。
同义词本身并不包含原对象中的数据或代码,它的作用仅仅相当于一个 指针。
在使用同义词时,系统根据 同义词的定义查找它所指向的对象,将对同义词的访问转化为对原对象的访问 。
同义词的作用仅仅是为了方便用户操作数据库对象。
Oracle 支持两种类型的同义词,即 私有同义词 和公共同义词。
私有同义词由普通用户创建,在默认情况下只能由用户本人使用。
公有同义词一般由 DBA 创建,可以由所有用户使用。
公共同义词的意义在于它代表了一个大家都可以访问的对象。
注:普通用户如果要访问公有同义词,需要具有对同义词所指向的原对象的访问权限。
一般来说,在具有相关数据库对象的权限后,即可进行相关的操作,但如果定义了同义词,就可以简化 SQL 语句的书写。
比如在访问其他用户模式下的数据库对象时,便可以省略对象前的模式名称。
用户可以随意为其他用户的一个对象创建一个同义词,但这并不意味着这个用户就具有了访问其他用户的对象的权限。
因为正如前面所提到的,只有在使用同义词时,系统才验证用户是否有相应的访问权限。
例如:
create synonym emp for scott.emp;
select * from emp;
注:以普通用户身份在 scott 用户模式下为数据库对象 emp 创建同义词 emp。
在没有访问权限的情况下,提示错误:ORA-00942: 表或视图不存在。
在考虑另一种情况,就是为不存在的对象创建同义词:
create synonym em for scott.em;
select * from em;
在使用同义词 em 访问源对象时,提示错误:ORA-00980: 同义词转换不再有效。
同义词的创建和删除
用户可以在自己的模式中创建同义词,这时需要具有 CREATE SYNONYM 这个系统权限。
如果希望在其他用户的模式中创建同义词,则需要具有 CREATE ANY SYNONYM 这个系统权限。
普通用户如果希望创建公有同义词,需要具有 CREATE PUBLIC SYNONYM 系统权限。
创建私有同义词的命令是 CREATE SYNONYM,它的语法规则为:
CREATE SYNONYM 同义词 FOR 用户名. 对象名;
创建公有同义词的语法格式为:
CREATE SYNONYM 同义词 FOR 用户名. 对象名;
注:这里的用户名. 对象名是指其他用户模式,因为一般在创建同义词时,是为了方便访问其他用户模式下的对象。
当然也可以在自己模式下创建同义词,对于普通用户而言,如果是创建私有同义词是没有什么意义的。
对于公有同义词而言,普通用户和 DBA 权限用户都可以在自己用户模式下,创建公有同义词,这样可以方便其他用户对该数据库对象的访问。
比如 DBA 权限用户创建 v$ 开头的有关动态性能视图的公有同义词。
用户如果不使用同义词时,可以将其删除。
删除同义词的命令是 DROP SYNONYM,这条命令的语法格式为:
DROP SYNONYM 同义词名;
注:如果要删除公有同义词的话,要在关键字 SYNONYM 之前加上关键字 PUBLIC。
一个用户可以删除自己创建的同义词,如果要删除其他用户创建的同义词,则要具有 DROP ANY SYNONYM 系统权限。
DBA 可以删除所有的公共同义词,普通用户需要具有 DROP PUBLIC SYNONYM 系统权限,才能删除公共同义词 。
同义词被删除以后,它的相关信息也将从数据字典中删除。
注:对于普通用户而言,即使是自己创建的公有同义词,仍需要具有 DROP PUBLIC SYNONYM 系统权限,才能删除自己创建的同义词。
同义词信息的查询
同义词作为一种数据库对象,它的相关信息被存储在数据字典中。
与同义词有关的数据字典有三个:user_synonyms、all_synonyms、dba_synonyms。
其中在数据字典 user_synonyms 中记录了当前用户所拥有的同义词。这个表的各列定义及其意义如下所示:
SYNONYM_NAME 同义词名称
TABLE_OWNER 所指向的对象属主
TABLE_NAME 所指向对象的名称
DB_LINK 数据库链接
注:DB_LINK 列是指在创建同义词 SYNONYM 时,TABLE_NAME 是通过 DBLINK 获得的。
如果要查询当前用户创建了哪些同义词,它们各代表哪个用户的哪个对象,可以执行下面的 SELECT 语句进行查询:
SELECT synonym_name, table_owner, table_name FROM user_synonyms;
在数据字典 all_synonyms 中记录了当前用户所能使用的所有同义词,包括私有同义词和公共同义词。
在数据字典 dba_synonyms 中记录了数据库中所有的同义词,包括每个用户创建的私有同义词和 DBA 创建的公共同义词。
这个视图只有 DBA 能够访问,它的结构除了包含数据字典 user synonyms 的所有列外,还有一个列 owner 代表同义词的创建者。
如果要在整个数据库范围内查询某个同义词的信息,可以对数据字典 dba_synonyms 进行查询。
例如,要查询用户 scott 所创建的所有同义词,可以执行下面的 SELECT 语句:
SELECT synonym_name, table_owner, table_name FROM dba_synonyms WHERE owner=’SCOTT’;
如果要查询用户 scott 的表 dept 具有哪些同义词,可以执行下面的 SELECT 语句:
SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner=’SCOTT’ AND table_name=’EMP’;
如果要查询系统中所有的公共同义词,可以执行下面的 SELECT 语句:
SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner=’PUBLIC’;
注:table_owner 和 owner 之前的区别:
table_owner 是指同义词所指向数据库对象的属主,一般就是指该对象的创建者,而 owner 是指同义词的创建者。
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131394.htm