2012-11-29 62 views
1

這裏有一個棘手的案例,其中包括DBA在內的5個人一直在努力工作數天......我提供終身考慮,以確定問題的根本原因。Oracle同義詞隨機無法查看

那就是:

Oracle客戶端:10克 Oracle服務器:11g的

我們有2種模式和1個用戶:

SCHEMA1

SCHEMA2

USER

我們有1臺'TOTO'這是在SCHEMA1SCHEMA1.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錯誤,那麼我們重新啓動應用程序幾次,它的回來......

會有人有一個想法或任何建議/提示可能導致我們確定哪些我們在這裏失蹤?

非常感謝您的幫助!

回答

3

補助金應該去USER,不SCHEMA2:

GRANT SELECT, UPDATE, DELETE, INSERT ON schema1.toto TO userxy; 

這應該解決的問題。如果不是的話,可以請您發表結果

SELECT * FROM all_objects WHERE object_name='TOTO'; 
+0

這似乎是解決了這個問題,並說清楚了這應該怎麼做。謝謝!但是我仍然有一個很難理解爲什麼它有時工作沒有它...顯然它不應該因此必須有,我們還沒有考慮(可能在我們用我們的模式創建的工具和框架)的外部因素這與用戶的補助搞亂。 – xaxa

+0

你確信的補助金不改變,所以只有三個進一步嫌疑人浮現在腦海中:1)改變PUBLIC SYNONYM繞過名稱解析,2)角色改變像DBA或SELECT_CATALOG_ROLE,它繞過了補助金制度或3)改變的連接AS SYSDBA。所有這三個相當不可能的,雖然。 –