關於oracle synonym 的總結整理
今天同事問我一個問題,說他發現有一個同義詞的問題很奇怪,不知怎麼解釋,具體描述如下:
在使用者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的同義詞,這樣會造成很多隱晦的問題,除非不得以才要建。哪個使用者需要,就在哪個使用者下建立本使用者下的同義詞,這樣比較清晰。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12129601/viewspace-709904/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle synonym 相關Oracle
- ORACLE關於NULL的總結OracleNull
- 關於ORACLE鎖的總結Oracle
- css+html關於文字的總結(整理中)CSSHTML
- 關於 資料壞塊 的整理和總結
- 關於oracle裡的process總結Oracle
- 關於ORACLE的一點總結Oracle
- 關於oracle中session跟蹤的總結OracleSession
- 關於Oracle塊的一些總結Oracle
- 關於Oracle Timezone的一點總結Oracle
- 關於ORACLE的鎖表與解鎖總結Oracle
- 關於近期的總結
- 關於UIWebView的總結UIWebView
- 關於BeautifulSoup的總結
- 關於HTML的總結HTML
- 關於oracle閃回資料歸檔的總結Oracle
- 關於oracle可傳輸表空間的總結Oracle
- 關於oracle 11g acs的一點總結:Oracle
- 關於802.11協議族簡介總結整理(轉)協議
- sqlserver關於always on的總結SQLServer
- mysql關於variable的總結MySql
- 關於jboss配置的總結
- 有關Oracle role的總結Oracle
- 效能測試關注點整理總結
- Oracle中的同義詞SYNONYMOracle
- sqlserver關於mirror映象的總結SQLServer
- sqlserver 關於DBCC CHECKDB的總結SQLServer
- 關於golang的time包總結Golang
- 關於 iOS 批量打包的總結iOS
- 關於Teradata PI的總結
- 關於控制檔案的總結
- 關於SCN的總結測試
- 關於QT的系統總結QT
- 【經典】連線oracle的總結(關於tnsname和監聽)Oracle
- 關於Oracle backup常用命令實際操作的總結Oracle
- 關於Servlet小總結Servlet
- 關於Hint再總結
- Oracle:優化方法總結(關於連表查詢)Oracle優化