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