[置顶] Oracle synonyms总结

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


    以上我的理解可能存在一定的问题,希望大家即时指正,一起讨论!

    你可能感兴趣的:(oracle,sql,数据库,user,table,System)