同義詞是現有對象的一個別名,和 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; 是一樣的