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.重新编译存储过程,发现编译通过。问题解决。

posted @ 2016-12-01 17:07  doson  阅读(5115)  评论(0编辑  收藏  举报