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; 是一樣的

 

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