1. 程式人生 > >Oracle儲存過程跨使用者執行查詢報錯

Oracle儲存過程跨使用者執行查詢報錯

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.重新編譯儲存過程,發現編譯通過。問題解決。