今天在写一个procedure,让其每天定时统计表空间的增长情况,定时功能通过oracle的job来完成。
在代码里,写了这样一个语句
select sum(bytes) from dba_data_files where tablespace_name='USRES'
编译时总是提示“table or view does not exist”,表或视图不存在。但是这个语句在procedure外面,作为单独的SQL语句来执行的时候是没有问题的,困惑了。Google之后,有人提到说,在procedure里,甚至是PL/SQL里,用户的role不在起作用了,被屏蔽掉了。噢~~,原来dba_data_files这个视图本来是属于sys用户的,如果你在创建其他的用户的时候将其角色设置为dba,普通情况下,该视图对这个用户是可见的,而在procedure里这个视图对他是不可见的。只有当sys用户显式把这个视图的权限grant给这用户的时候,在procedure里才对其可见,执行了grant select on dba_data_files to myuser后,这个错误消失,编译通过。