在使用者codprov使用者下,建立了兩個同義詞,乙個是public的,乙個是本使用者下的,但是同義詞的名稱一樣,codprov使用者有查詢cod使用者下所有物件的許可權。
create or replace public synonym tb_ofr_cust_rep_detail for cod.vw_ofr_cust_rep_detail;
create or replace synonym codprov.tb_ofr_cust_rep_detail for cod.tb_ofr_cust_rep_detail;
cod.vw_ofr_cust_rep_detail的內容如下:
create or replace view cod.vw_ofr_cust_rep_detail as
select rd.disc_rule_id disc_rule_id,
rd.stat_sect_id stat_sect_id,
rd.money_item money_item,
rd.money_clac_type money_clac_type,
rd.disc_count disc_count
from mv_ofr_cust_rep_pri rp,
mv_ofr_cust_rep_detail rd
where rp.disc_rule_id = rd.disc_rule_id
and rp.money_type = '2'
union
select rd.disc_rule_id disc_rule_id,
'a' || rd.disc_rule_id || '_9999' stat_sect_id,
rd.money_item money_item,
rd.money_clac_type money_clac_type,
rd.disc_count disc_count
from mv_ofr_cust_rep_pri rp,
mv_ofr_cust_rep_detail rd
where rp.disc_rule_id = rd.disc_rule_id
and rp.money_type = '1';
問題:查詢:select * from tb_ofr_cust_rep_detail;能得出如下結果:
disc_rule_id stat_sect_id money_item money_clac_type disc_count
1 a1_9999 1 1 .02
1 a1_9999 2 2 10
1 a1_9999 3 2 0
1 a1_9999 4 2 15
10016 a10016_9999 1 1 .02
查詢:select * from codprov.tb_ofr_cust_rep_detail;也得出如下結果:
disc_rule_id stat_sect_id money_item money_clac_type disc_count
1 a1_9999 1 1 .02
1 a1_9999 2 2 10
1 a1_9999 3 2 0
1 a1_9999 4 2 15
10016 a10016_9999 1 1 .02
可是查詢:select * from cod.tb_ofr_cust_rep_detail;卻報錯ora-00942:表和檢視不存在,而查詢同義詞select * from codprov.tb_ofr_cust_rep_detail時卻沒有報ora-00980同義詞轉換不再有效的錯誤。是為什麼?
經過分析,發現tb_ofr_cust_rep_detail在cod下確實不存在,因此查詢:select * from cod.tb_ofr_cust_rep_detail報ora-00942:表和檢視不存在是必然的,而select * from codprov.tb_ofr_cust_rep_detail時卻沒有報ora-00980同義詞轉換不再有效的錯誤,那是因為這個使用者下建立了乙個 public的同義詞,在codprov使用者下建立私有的同義詞:create or replace synonym codprov.tb_ofr_cust_rep_detail for cod.tb_ofr_cust_rep_detail時;對映的cod.tb_ofr_cust_rep_detail實際上是先前建立的public 同義詞,而他們的名稱正好一致,所有給人以錯覺,以為他引用的還是cod.tb_ofr_cust_rep_detail的表。如果不建立這個 public同義詞,那麼查詢select * from codprov.tb_ofr_cust_rep_detail必定會報ora-00980同義詞轉換不再有效的錯誤。或者說建立的public同義詞名 稱如果和建立私有同義詞說對映的物件的名稱不一樣時,那麼查詢私有同義詞時也會報ora-00980錯誤。 --這個問題得到解釋。
這裡順便說一下:
1.如果在某乙個使用者下,建立了乙個public同義詞,如果查詢不帶使用者名稱查詢是不會報表或檢視不存在的錯誤,如果帶上使用者名稱查詢會則報ora-00942表或檢視錯誤,因為這個使用者下確實沒有這個物件。
2.如果再在這個使用者下建立乙個同名的物件,表、檢視或者同義詞,那麼不管帶不帶使用者名稱查詢,他都會查詢這個使用者私有的物件,不會查詢那個public的同義詞,這一點特別要注意,如果在生產環境中,可能會造成很大的資料錯誤。
最後的總結是,一般情況下盡量避免建立public的同義詞,這樣會造成很多隱晦的問題,除非不得以才要建。哪個使用者需要,就在哪個使用者下建立本使用者下的同義詞,這樣比較清晰。
關於程式關於世界
首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...
關於血液關於軟體
1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...
關於冷漠,關於愛情
我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...