synonyms(同义词)就是给数据库对象取一个别名,因为同义词只是一个别名,因此它只需在数据字典中存储自身的定义,而无需额外的存储空间。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。
同义词分为两种:公共同义词与私有同义词。公共同义词由特殊的用户组 PUBLIC
所拥有,一般由DBA、SYSTEM、SYS创建,数据库中的每个用户都能够访问。而私有同义词属于某个用户,此用户可以通过授权来控制哪些用户可以使用属于她的私有同义词。创建同义词语法:CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户.对象。
同义词主要是出于方便和安全性上的考虑,主要作用如下:
隐藏一个数据库对象的名字和拥有者
隐藏分布式数据库中远程对象的位置
简化SQL 语句
和视图类似能够限制访问,用于实现更精细安全的访问控制
下面举例来说明:
--连接sys用户
SQL> connect sys/gyb860518 as sysdba;
已连接。
--查询所有的同义词
SQL> select synonym_name, table_owner, table_name from user_synonyms;
SYNONYM_NAME TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------ ------------------
DEF$_AQCALL SYSTEM DEF$_AQCALL
DEF$_CALLDEST SYSTEM DEF$_CALLDEST
DEF$_SCHEDULE SYSTEM DEF$_SCHEDULE
DEF$_ERROR SYSTEM DEF$_ERROR
DEF$_DEFAULTDEST SYSTEM DEF$_DEFAULTDEST
DEF$_LOB SYSTEM DEF$_LOB
XMLDOM XDB DBMS_XMLDOM
XMLPARSER XDB DBMS_XMLPARSER
XSLPROCESSOR XDB DBMS_XSLPROCESSOR
已选择9行。
--创建scott用户的test表的私有同义词(默认为私有)
SQL> create synonym test_syn for scott.test;
同义词已创建。
--用户可以通过简单的语句来查询test表
SQL> select * from test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--连接scott用户
SQL> connect scott/gyb860518;
已连接。
--执行查询私有同义词报错
SQL> select * from test_syn;
select * from test_syn
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
--在sys用户下授权给scott
SQL> grant select on test_syn to scott;
授权成功。
-在查询私有同义词成功
SQL> select * from sys.test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--在sys用户下创建共有同义词(这里与上面的私有同义词设为同名,后面用到)
SQL> create public synonym test_syn for scott.test2;
同义词已创建。
--查询同名的同义词,
以私有同义词优先(类似于局部变量)
SQL> select * from test_syn;
ID NAME
---------- --------------------
0437 gyb
002 gao
003 aaa
004 gyb
005 gyb
--重新创建一个共有同义词
SQL> create public synonym test2_syn for scott.test2;
同义词已创建。
--在scott用户下查询共有同义词成功,
隐藏了test2表的名称以及它所属的schema名
SQL> select * from test2_syn;
ID AGE
---------- ----------
001 23
--通过同义词来更新表的数据
SQL> update test2_syn set age=24 where id='001';
已更新 1 行。
SQL> select * from test2_syn;
ID AGE
---------- ----------
001 24
--删除同义词
SQL> drop synonym test_syn;
同义词已删除。
对于同义词我个人觉得它是不可修改的,因为它的定义是保存在数据字典中的,而数据字典是一组只读表的组合,不可更新。试一下看看:
--在sys用户下查询所有的同义词
SQL> select synonym_name, table_owner from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ----------------------------
DEF$_AQCALL SYSTEM
DEF$_CALLDEST SYSTEM
DEF$_SCHEDULE SYSTEM
DEF$_ERROR SYSTEM
DEF$_DEFAULTDEST SYSTEM
DEF$_LOB SYSTEM
XMLDOM XDB
XMLPARSER XDB
XSLPROCESSOR XDB
TEST_SYN SCOTT
已选择10行。
--更新scott拥有者的同义词名
SQL> update user_synonyms set synonym_name ='haha' where table_owner='scott';
已更新0行。
SQL> select synonym_name, table_owner from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ------------------------------
DEF$_AQCALL SYSTEM
DEF$_CALLDEST SYSTEM
DEF$_SCHEDULE SYSTEM
DEF$_ERROR SYSTEM
DEF$_DEFAULTDEST SYSTEM
DEF$_LOB SYSTEM
XMLDOM XDB
XMLPARSER XDB
XSLPROCESSOR XDB
TEST_SYN SCOTT //这里并没有被更新
已选择10行。
--转自