2012-03-08 273 views
2

我剛試圖查詢表AVC時突然開始出現此錯誤。ORA-04045:重新編譯/重新驗證期間的錯誤

ORA-04045: errors during recompilation/revalidation of PUBLIC.AVC 
ORA-04098: trigger 'TTMS.ALTERED_TTMSDB_TABS_TRIGGER' is invalid and failed re-validation 

select * from avc不工作 但select * from exfc.avc確實工作。

誰能告訴我發生了什麼事?

回答

3

推測在您的模式中沒有一個對象名爲AVC。當您在沒有模式限定符的情況下參考AVC時,它因此使用該名稱訪問PUBLIC對象。要找出是什麼樣的對象,SELECT object_type FROM all_objects WHERE object_name='AVC' AND owner='PUBLIC'

不管它是什麼,查詢它是由於某種原因導致觸發器觸發。也許這是某種審計功能。但目前觸發器無效。這可能意味着某人修改了觸發器本身,但發生了錯誤;或者它可能意味着有人丟棄或修改了觸發器依賴的其他某個對象,這樣觸發器代碼就不再有效。

因此,無論誰對該觸發器的響應都需要找出編譯過程中發生的錯誤並解決它。

當您顯式查詢EXFC.AVC時,您正在繞過PUBLIC對象並直接轉到某個底層對象,可能是實際的表。看起來很奇怪,你可以訪問它,因爲通過公共同義詞進行路由訪問的整個過程通常是爲了防止直接訪問對象。事實上,如果觸發器的目的是審計對錶格的訪問,那麼允許你完全繞過它是一個非常大的設計缺陷。

+1

+1,但這個nit選擇是必需的:公共同義詞不能「阻止直接訪問」任何東西,它只是一種避免在代碼中硬編碼模式名稱的方法,或者允許引用某些東西而不是使用一個不同的名字。 – 2012-03-09 06:04:34

0

是的,它基本上告訴你,提到的觸發器有一個錯誤。最簡單的方法我可以解決這個問題,因爲我在SQL開發人員工作是,

打開「觸發器」選項卡並搜索此觸發器。編譯它並再次運行您的查詢。作品完美無缺:)