synonyms

synonyms(同义词)就是给数据库对象取一个别名,因为同义词只是一个别名,因此它只需在数据字典中存储自身的定义,而无需额外的存储空间。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。

 

同义词分为两种:公共同义词与私有同义词。公共同义词由特殊的用户组 PUBLIC所拥有,一般由DBA、SYSTEM、SYS创建,数据库中的每个用户都能够访问。而私有同义词属于某个用户,此用户可以通过授权来控制哪些用户可以使用属于她的私有同义词。创建同义词语法:CREATE[PUBLIC]  SYNONYM  同义词名称FOR  用户.对象。

 

同义词主要是出于方便和安全性上的考虑,主要作用如下:

  • 隐藏一个数据库对象的名字和拥有者
  • 隐藏分布式数据库中远程对象的位置
  • 简化SQL 语句
  • 和视图类似能够限制访问,用于实现更精细安全的访问控制

下面举例来说明:

--连接sys用户

SQL> connectsys/gyb860518 as sysdba;
已连接。

--查询所有的同义词

SQL> selectsynonym_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 synonymtest_syn for scott.test;

同义词已创建。

--用户可以通过简单的语句来查询test表

SQL> select * fromtest_syn;

ID        NAME
---------- --------------------
0437      gyb
002       gao
003       aaa
004       gyb
005       gyb

--连接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        NAME
---------- --------------------
0437      gyb
002       gao
003       aaa
004       gyb
005       gyb

--在sys用户下创建共有同义词(这里与上面的私有同义词设为同名,后面用到)

SQL> create publicsynonym test_syn for scott.test2;

同义词已创建。

--查询同名的同义词,以私有同义词优先(类似于局部变量)

SQL> select * fromtest_syn;

ID        NAME
---------- --------------------
0437      gyb
002       gao
003       aaa
004       gyb
005       gyb

--重新创建一个共有同义词

SQL> create publicsynonym test2_syn for scott.test2;

同义词已创建。

--在scott用户下查询共有同义词成功,隐藏了test2表的名称以及它所属的schema名

SQL> select * fromtest2_syn;

ID               AGE
---------- ----------
001               23

--通过同义词来更新表的数据

SQL> update test2_syn set age=24 whereid='001';

已更新 1 行。

SQL> select * from test2_syn;

ID               AGE
---------- ----------
001               24

 

--删除同义词 

SQL> drop synonymtest_syn;

同义词已删除。

对于同义词我个人觉得它是不可修改的,因为它的定义是保存在数据字典中的,而数据字典是一组只读表的组合,不可更新。试一下看看:

--在sys用户下查询所有的同义词

SQL> selectsynonym_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> updateuser_synonyms set synonym_name ='haha' wheretable_owner='scott';

已更新0行。

SQL> selectsynonym_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行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值