同义词是一个模式对象的别名。例如,您可以为一个表或视图、 序列、 PL/SQL 程序单元、 用户定义的对象类型、或另一个同义词等创建同义词。因为同义词只是一个别名,因此除了要在数据字典存储其定义之外,不需要其它存储。
同义词可以为数据库用户简化 SQL 语句。同义词也可以用于隐藏底层模式对象的标识和位置。如果必须重命名或移动底层对象,仅需要重新定义同义词。基于同义词的应用程序,可以无需修改而继续工作。
您可以创建私有同义词和公共同义词。私有同义词与其所有者在同一个模式中,只有其所有者对其可用性具有控制权。公共同义词由名为PUBLIC的用户组所有,并且能被每一个数据库用户访问。
在示例 4-9 中,数据库管理员为 hr.employees 表创建了一个叫做people的公共同义词。然后,用户连接到 oe 模式,并计算通过同义词引用的表中的行的数目。
SQL> CREATE PUBLIC SYNONYM people FOR hr.employees;
Synonym created.
SQL> CONNECT oe
Enter password: password
Connected.
SQL> SELECT COUNT(*) FROM people;
COUNT(*)
----------
107
请尽量少用公共同义词,因为它们使数据库整合更困难。如 4-9 例中所示,如果另一个管理员尝试创建people公共同义词,则会创建失败,因为在一个数据库中只能存在一个叫做people的公共同义词。过度使用公共同义词会导致应用程序之间的命名空间冲突。
SQL> CREATE PUBLIC SYNONYM people FOR oe.customers;
CREATE PUBLIC SYNONYM people FOR oe.customers
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
SQL> select owner, synonym_name, table_owner, table_name from dba_synonyms where synonym_name = 'PEOPLE';
OWNER SYNONYM_NAME
------------------------------ ------------------------------
TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------
PUBLIC PEOPLE
HR EMPLOYEES