同义词

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,它的语法规则为:

  1. CREATE SYNONYM 同义词 FOR 用户名.对象名; 

例如,假设当前用户为了方便地访问scott用户的表dept,可以执行下面的CREATE语句创建同义词:

  1. CREATE SYNONYM sy_dept FOR scott.dept; 

这样在具有相应权限的情况下,当前用户就可以通过这个同义词代替原来的表,在SQL语句中通过访问同义词来对原来的表进行操作。例如:

  1. SELECT deptno,dname,loc FROM sy_dept; 

创建公有同义词的命令也是CREATE SYNONYM,只是要使用PUBLIC关键字进行限定。创建公有同义词的命令格式为:

  1. CREATE PUBLIC SYNONYM 同义词 FOR 用户名.对象名; 

例如,为了让大家都能方便地访问scott用户的表dept,DBA可以通过执行下面的语句创建一个公共同义词:

  1. SQL> CREATE PUBLIC SYNONYM pub_dept FOR scott.dept; 

在具有相应权限的情况,任何用户都可以通过这个同义词访问SCOTT用户的表dept,例如,可以向表中写入一行数据:

  1. SQL> INSERT INTO pub_dept(deptno,dname,loc)  
  2.      VALUES(100,'NETWORK','BEIJING'); 

用户如果不使用同义词时,可以将其删除。删除同义词的命令是DROP SYNONYM。这条命令的语法格式为:

  1. DROP SYNONYM 同义词; 

一个用户可以删除自己创建的同义词,如果要删除其他用户创建的同义词,则要具有DROP ANY SYNONYM系统权限。DBA可以删除所有的公共同义词,普通用户需要具有DROP PUBLIC SYNONYM系统权限,才能删除公共同义词。同义词被删除以后,它的相关信息也将从数据字典中删除。

 

1.9.3   同义词信息的查询

同义词作为一种数据库对象,它的相关信息被存储在数据字典中。与同义词有关的数据字典有三个:user_sysnonyms、all_synonyms、dba_synonyms。

其中在数据字典user_synonyme中记录了当前用户所拥有的同义词。这个表的个列定义及其意义如下所示:

  1. 名称是否为空? 类型意义  
  2. SYNONYM_NAME NOT NULL VARCHAR2(30) 同义词的名称  
  3. TABLE_OWNER VARCHAR2(30) 所指向的对象属主  
  4. TABLE_NAME NOT NULL VARCHAR2(30) 所指向的对象名称  
  5. DB_LINK VARCHAR2(128) 数据库链接 

如果要查询当前用户创建了哪些同义词,它们各代表哪个用户的哪个对象,可以执行下面的SELECT语句进行查询:

  1. SQL> SELECT synonym_name,table_name,table_owner FROM user_synonyms; 

在数据字典all_synonyms中记录了当前用户所能使用的所有同义词,包括私有同义词和公共同义词。

在数据字典dba_synonyms中记录了数据库中所有的同义词,包括每个用户创建的私有同义词和DBA创建的公共同义词。这个视图只有DBA能够访问,它的结构除了包含数据字典user_synonyms的所有列外,还有一个列owner代表同义词的创建者。

如果要在整个数据库范围内查询某个同义词的信息,可以对数据字典dba_synonyms进行查询。例如,要查询用户scott所创建的所有同义词,可以执行下面的SELECT语句:

  1. SQL> SELECT synonym_name, table_name, table_owner FROM dba_synonyms  
  2.      WHERE owner='SCOTT'

如果要查询用户scott的表dept具有哪些同义词,可以执行下面的SELECT语句:

  1. SQL> SELECT synonym_name,owner FROM dba_synonyms  
  2.      WHERE table_owner='SCOTT' AND table_name='DEPT'

如果要查询系统中所有的公共同义词,可以执行下面的SELECT语句:

  1. SQL> SELECT synonym_name, table_name, table_owner FROM dba_synonyms  
  2.      WHERE owner='PUBLIC'
请使用浏览器的分享功能分享到微信等