這裏有一個棘手的案例,其中包括DBA在內的5個人一直在努力工作數天......我提供終身考慮,以確定問題的根本原因。Oracle同義詞隨機無法查看
那就是:
Oracle客戶端:10克 Oracle服務器:11g的
我們有2種模式和1個用戶:
SCHEMA1
SCHEMA2
USER
我們有1臺'TOTO'
這是在SCHEMA1
(SCHEMA1.TOTO
)定義 我們有表'TOTO'
的私人代名詞,堪稱SCHEMA2
定義'TOTO'
,這樣創建:
CREATE SYNONYM SCHEMA2.TOTO FOR SCHEMA1.TABLE1;
我們已授予SELECT, UPDATE,DELETE,INSERT的「SCHEMA2.TOTO」(等近義詞)權限的到SCHEMA2(使任何會話跑到離SCHEMA2訪問同義詞表)
GRANT SELECT, UPDATE, DELETE, INSERT ON SCHEMA2.TOTO TO SCHEMA2;
我們的應用程序連接到數據庫與USER
,然後直接切換至SCHEMA2
:
ALTER SESSION SET CURRENT_SCHEMA=SCHEMA2;
那之後,它會嘗試在不受SCHEMA1前綴同義詞名執行的同義詞表的SELECT查詢(這是框架的約束,我們使用):
SELECT COL FROM TOTO;
大多數這個查詢工作成功的時代,WHI ch是我們所期望的,因爲我們已將會話更改爲SCHEMA2
,默認情況下是查看對象的位置。
但有時會失敗,出現ORA-00942: table or view does not exist
錯誤。
我堅持這樣一個事實:在它工作的時間和失敗的時間之間沒有任何變化,我們剛剛重新啓動了應用程序(當然,在每次啓動時重新連接到數據庫) 。 我們已經調查了DBA監控USER,SCHEMA1,SCHEMA2上的所有事件,希望找到一個外部進程修改其中一個成功和失敗之間的GRANTS,但沒有任何變化。然而,在某些時候,randomnly我們得到ORA-00942錯誤,那麼我們重新啓動應用程序幾次,它的回來......
會有人有一個想法或任何建議/提示可能導致我們確定哪些我們在這裏失蹤?
非常感謝您的幫助!
這似乎是解決了這個問題,並說清楚了這應該怎麼做。謝謝!但是我仍然有一個很難理解爲什麼它有時工作沒有它...顯然它不應該因此必須有,我們還沒有考慮(可能在我們用我們的模式創建的工具和框架)的外部因素這與用戶的補助搞亂。 – xaxa
你確信的補助金不改變,所以只有三個進一步嫌疑人浮現在腦海中:1)改變PUBLIC SYNONYM繞過名稱解析,2)角色改變像DBA或SELECT_CATALOG_ROLE,它繞過了補助金制度或3)改變的連接AS SYSDBA。所有這三個相當不可能的,雖然。 –