同义词是现有对象的一个别名,和 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; 是一样的