详解同义词(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/