Oracle 原理: 公有同义词 和 私有同义词

同义词是现有对象的一个别名,和 C++ 里面的typedef关键字很像。同义词都能简化SQL语句,隐藏对象的名称和所有者,也可以提供对对象的公共访问。 在Oracle中,同义词分为公有同义词和私有同义词。公有同义词可被所有数据库用户访问。私有同义词只能再其模式内访问,且不能与当前模式的对象同名。

CREATE  [PUBLIC] SYNONYM  [同义词名] FOR [对象名];

如果不写 PUBLIC 那创建的同义词就是私有同义词,写了 PUBLIC 就是公有同义词。

创建同义词需要权限

GRANT CREATE  [PUBLIC] SYNONYM TO [用户名]

删除同义词(删除同义词也是需要权限的)

DROP  [PUBLIC] SYNONYM  [同义词名];

替换同义词(要权限):

CREATE OR REPLACE SYNONYM  [新同义词名] FOR [对象名];

私有同义词,由于每个模式私有的,可以在不同模式中创建同名的私有同义词,互不影响;

 

-------创建表结构
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
);
-----插入测试数据----
truncate table salary_tbl;
begin
 for i in  1..100
     loop
     insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,6),100*POWER(10000,i*0.01),'雇佣者'||Mod(i,6)); 
   end loop;
end; 
/
commit;
--------创建私有同义词---------
CREATE  SYNONYM  s_tbl FOR SALARY_TBL;
--------用私有同义词来查询-----------
select * from s_tbl s where s.employer_nm ='雇佣者1'; 
--------删除私有同义词----------
DROP   SYNONYM  s_tbl;

我们知道查找表信息可以用如下SQL: select * from tab; 那么这里 tab 是表名吗?

我可以查看对象表,来查找对象信息

select * from all_objects where object_name='TAB';

可以看见 TAB 这个对象在SYS里是一个视图,而在公共里是一个同义词,这里的TAB并不是一张表;

我们可以查看同义词信息:

select * from all_synonyms  where SYNONYM_NAME='TAB';

我们可以看见不管OWNER是 公共还是SYSTEM,TAB同义词对应的都是SYS模式(用户)下的TAB表;

select * from tab ; 是根据同义词查找 ,和查询表 select * from sys.tab; 是一样的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章