在Oracle中,在USERA下編寫一個存儲過程,該存儲過程中引用了另一個用戶USERB下的表或視圖對象。編譯該存儲過程,出現編譯錯誤。報ORA-00942: table or view does not exist。
但是該表或視圖的確在USERB下存在,而且已經授予了USERA DBA角色的權限,即可以查詢任何用戶下的表或視圖。將存儲過程中的該報錯語句復制粘貼到SQL窗口中執行,不報錯。為什么放在存儲過程中會報上述錯誤呢?
經過研究,發現ORACLE對於在存儲過程中引用其他用戶下的表或視圖對象有特別的限制,要求USERA對這個表或視圖具有直接的SELECT權限,而不是通過角色,如DBA間接獲取的權限。否則就會報上述錯誤導致編譯不通過。
解決該問題的方法如下:
1.登錄到USERB用戶下。
2.GRANT SELECT ON 表名(或視圖名) TO USERA
3.重新登錄到USERA用戶下。
4.重新編譯存儲過程,發現編譯通過。問題解決。