1.9 同义词
同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写。
1.9.1 同义词的概念和类型
利用同义词可以为用户的一个对象,或者其他用户的一个对象定义别名,从而简化命令或程序的书写,在命令或程序中可以直接使用同义词代替原来的对象。
可以为表、视图、存储程序、序列等对象建立同义词,也可以为一个同义词再建立同义词,甚至可以为一个不存在的对象建立同义词,系统仅仅在使用同义词时才验证它所代表的对象是否存在。
同义词本身并不包含原对象中的数据或代码,它的作用仅仅相当于一个指针。在使用同义词时,系统根据同义词的定义查找它所指向的对象,将对同义词的访问转化为对原对象的访问。同义词的作用仅仅是为了方便用户操作数据库对象。
Oracle支持两种类型的同义词,即私有同义词和公共同义词。私有同义词由普通用户创建,在默认情况下只能由用户本人使用。公有同义词一般由DBA创建,可以由所有用户使用。
公共同义词的意义在于它代表了一个大家都可以访问的对象。例如,程序包DBMS_OUTPUT是属于特权用户SYS的,但是任何一个用户都可以直接使用它,而不用指定它所在的模式。普通用户能够使用的名称DBMS_OUTPUT显然是一个公共同义词。
用户可以随意为其他用户的一个对象创建一个同义词,但这并不意味着这个这个用户就具有了访问其他用户的对象的权限。如果要通过同义词访问其他用户的对象,还需要具有相应的权限。只有在使用同义词时,系统才验证用户是否有相应的访问权限。
1.9.2 同义词的创建与删除
用户可以在自己的模式中创建同义词,这需要具有CREATE SYNONYM这个系统权限。如果希望在其他用户的模式中创建同义词,则需要具有CREATE ANY SYNONYM这个系统权限。普通用户创建的同义词一般都是私有同义词,公有同义词一般由DBA创建,普通用户如果希望创建同义词,则需要CREATE PUBLIC SYNONYM这个系统权限。
创建私有同义词的命令是CREATE SYNONYM,它的语法规则为:
- CREATE SYNONYM 同义词 FOR 用户名.对象名;
例如,假设当前用户为了方便地访问scott用户的表dept,可以执行下面的CREATE语句创建同义词:
- CREATE SYNONYM sy_dept FOR scott.dept;
这样在具有相应权限的情况下,当前用户就可以通过这个同义词代替原来的表,在SQL语句中通过访问同义词来对原来的表进行操作。例如:
- SELECT deptno,dname,loc FROM sy_dept;
创建公有同义词的命令也是CREATE SYNONYM,只是要使用PUBLIC关键字进行限定。创建公有同义词的命令格式为:
- CREATE PUBLIC SYNONYM 同义词 FOR 用户名.对象名;
例如,为了让大家都能方便地访问scott用户的表dept,DBA可以通过执行下面的语句创建一个公共同义词:
- SQL> CREATE PUBLIC SYNONYM pub_dept FOR scott.dept;
在具有相应权限的情况,任何用户都可以通过这个同义词访问SCOTT用户的表dept,例如,可以向表中写入一行数据:
- SQL> INSERT INTO pub_dept(deptno,dname,loc)
- VALUES(100,'NETWORK','BEIJING');
用户如果不使用同义词时,可以将其删除。删除同义词的命令是DROP SYNONYM。这条命令的语法格式为:
- DROP SYNONYM 同义词;
一个用户可以删除自己创建的同义词,如果要删除其他用户创建的同义词,则要具有DROP ANY SYNONYM系统权限。DBA可以删除所有的公共同义词,普通用户需要具有DROP PUBLIC SYNONYM系统权限,才能删除公共同义词。同义词被删除以后,它的相关信息也将从数据字典中删除。
1.9.3 同义词信息的查询
同义词作为一种数据库对象,它的相关信息被存储在数据字典中。与同义词有关的数据字典有三个:user_sysnonyms、all_synonyms、dba_synonyms。
其中在数据字典user_synonyme中记录了当前用户所拥有的同义词。这个表的个列定义及其意义如下所示:
- 名称是否为空? 类型意义
- SYNONYM_NAME NOT NULL VARCHAR2(30) 同义词的名称
- TABLE_OWNER VARCHAR2(30) 所指向的对象属主
- TABLE_NAME NOT NULL VARCHAR2(30) 所指向的对象名称
- DB_LINK VARCHAR2(128) 数据库链接
如果要查询当前用户创建了哪些同义词,它们各代表哪个用户的哪个对象,可以执行下面的SELECT语句进行查询:
- SQL> SELECT synonym_name,table_name,table_owner FROM user_synonyms;
在数据字典all_synonyms中记录了当前用户所能使用的所有同义词,包括私有同义词和公共同义词。
在数据字典dba_synonyms中记录了数据库中所有的同义词,包括每个用户创建的私有同义词和DBA创建的公共同义词。这个视图只有DBA能够访问,它的结构除了包含数据字典user_synonyms的所有列外,还有一个列owner代表同义词的创建者。
如果要在整个数据库范围内查询某个同义词的信息,可以对数据字典dba_synonyms进行查询。例如,要查询用户scott所创建的所有同义词,可以执行下面的SELECT语句:
- SQL> SELECT synonym_name, table_name, table_owner FROM dba_synonyms
- WHERE owner='SCOTT';
如果要查询用户scott的表dept具有哪些同义词,可以执行下面的SELECT语句:
- SQL> SELECT synonym_name,owner FROM dba_synonyms
- WHERE table_owner='SCOTT' AND table_name='DEPT';
如果要查询系统中所有的公共同义词,可以执行下面的SELECT语句:
- SQL> SELECT synonym_name, table_name, table_owner FROM dba_synonyms
- WHERE owner='PUBLIC';