详解同义词(synonym)

详解同义词(synonym)
synonym(同义词):是一张表,视图,序列,函数等数据库对象的别名。同义词依赖于目标对象
如果目标对象被删除或者该表了,同名就无效了。同义词提供了数据独立性位置无关性。运用
程序不必知道使用的同义词所依赖的对象的名字,在那个表空间等。但是用户使用别名也需要
获得相应的授权。以使用同义词标识的目标对象。

private synonym:存在于某个用户的模式中,只能为该用户访问或者获得授权可以访问
同义词所依赖的对象的用户。
public synonym:该同义词对数据库中所有用户都可用。

在自己的schema创建private synonym需要create synonym特权。
在其他的schema创建private synonym需要create any synonym特权。
创建public synonym需要create public synonym特权。


语法格式:
create [ or replace ] [ public ] synonym_name
   [ schema. ] synonym_name
   for [ schema. ] object [ @ dblink ] ;

创建,使用,删除public synonym
SQL> desc scott.acctmanager
Name    Type         Nullable Default Comments 
------- ------------ -------- ------- -------- 
AMID    CHAR(4)                                
AMFIRST VARCHAR2(12)                           
AMLAST  VARCHAR2(12)                           
AMEDATE DATE         Y        SYSDATE          
AMSAL   NUMBER(8,2)  Y                         
AMCOMM  NUMBER(7,2)  Y        0                
REGION  CHAR(2)      Y                
SQL> create public synonym manager for scott.acctmanager;
同义词已创建。
SQL> conn hr/hr
已连接。
SQL> select * from manager;
select * from manager
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在
因为不没有对同义词所依赖的对象的访问权限。
SQL> conn scott
输入口令:
已连接。
SQL> grant all on acctmanager to hr;
授权成功。
给hr用户授予对表acctmanager 的所有权限。
SQL> conn hr/hr
已连接。
SQL> select count(*) from manager;

  COUNT(*)
----------
         1
SQL> delete from manager;
已删除 1 行。
使用同义词执行DML操作。
SQL> rollback;
回退已完成。
SQL> conn scott/TIGER
已连接。
再次切换到scott用户,撤销所有对对象acctmanager的操作权限。
SQL> revoke all on acctmanager from hr;
撤销成功。

授权给hr用户对同义词manager所有的操作权限。
SQL> grant all on manager to hr;
授权成功。
SQL> conn hr/hr
已连接。
SQL> update manager
  2  set amsal=7000
  3  where amid='0001';
已更新 1 行。
从上面可以看出对同义词相应授权就是对同义词所依赖的目标对象的授权。
SQL> conn system as sysdba
输入口令:
已连接。
SQL> drop synonym manager;
drop synonym manager
             *
第 1 行出现错误:
ORA-01434: 要删除的专用同义词不存在
删除public synonym的时候需要添加关键字public 
SQL> drop public synonym manager;
同义词已删除。

创建,使用,删除private synonym


SQL> conn hr/hr
已连接。
SQL> create synonym emp for employees;
同义词已创建。
把emp所依赖的目标的所有操作特权授予scott用户。
SQL> grant all on emp to scott;
授权成功。
SQL> conn scott/TIGER
已连接。
SQL> select count(*)
  2  from emp;
from emp
     *
第 2 行出现错误:
ORA-00942: 表或视图不存在
SQL> select count(*)
  2  from hr.emp;

  COUNT(*)
----------
       107
因为emp是private synonym需要添加shema前缀。

使用同义词执行DML操作。
SQL> update hr.emp
  2  set salary=30000
  3  where employee_id=100;
已更新 1 行。
SQL> conn hr/hr
已连接。
SQL> drop synonym emp;
同义词已删除。
删除private synonym与删除public synonym的方式不同。

在oracle中使用同义词寻找对象的步骤是:
1、首先查找与同义词同名的对象是否存在于当前的shema中。
2、根据给定的同义词查找私有同义词是否存在于当前的shema中。
3、如果私有同义词没有找到,根据给定的同义词查找公有同义词。
4、如果没有找到公有同义词,oracle数据库会报错。

SQL> conn system as sysdba
输入口令:
已连接。
SQL> create public synonym people for scott.acctmanager;
同义词已创建
SQL> grant all on people to hr;
授权成功。
SQL> conn hr/hr
已连接。
SQL> create table people(id char(12),name varchar2(30),sex char(1) check (sex in ('f','m')));
表已创建。
SQL> insert into people values('0001','zhangsan','m');
已创建 1 行。
SQL> select count(*) from people;
  COUNT(*)
----------
         1
从上面两条sql语句可以证明:首先查找与同义词同名的对象是否存在于当前的shema中。


SQL> drop table people;
表已删除。
SQL> select count(*)
  2  from people;
  COUNT(*)
----------
         1
SQL> create synonym people for employees;
同义词已创建。
SQL> select count(*) from people;
  COUNT(*)
----------
       107
注:hr 中的employees中有107条记录。
从上面的一段sql语句可以证明:
如果私有同义词在当前shema中没有找到,根据给定的同义词查找公有同义词。
根据给定的同义词查找私有同义词是否存在于当前的shema中。
SQL> drop public synonym people;
同义词已删除。
SQL> select count(*) from people;
select count(*) from people
                     *
第 1 行出现错误:
ORA-00942: 表或视图不存在
从上面的sql语句可以证明:
如果没有找到公有同义词,oracle数据库会报错。

另外同义词不可以滥用,不然容易引起对象名的混乱。可以使用数据字典dba_synonyms
查询有关同义词的相关信息:
SQL> desc dba_synonyms
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 SYNONYM_NAME                              NOT NULL VARCHAR2(30)
 TABLE_OWNER                                        VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 DB_LINK                                            VARCHAR2(128)

SQL> create synonym manager for  scott.acctmanager;
同义词已创建。
SQL> select * from dba_synonyms
  2  where synonym_name='MANAGER';
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK
------------------------------ ------------------------------ ------------------------------ ------------------------------ --------------------------------------------------------------------------------
SYSTEM                         MANAGER                        SCOTT                          ACCTMANAGER                    

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-715853/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26110315/viewspace-715853/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值