今天在我的ORACLE 9.2.0.1 /WINXP平台创建跨用户的VIEW发现一个奇怪问题。
我执行了grant dba to userc,然后运行
create or replace view userc.view
2 As
3 select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
4 to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
5 to_char( c.expire_date,‘YYYYMMDD‘) expire_date
6 from usera.table_a c,userb.table_b a
7 where c.scheme_id = a.scheme_id and a.event_id=1
8 group by a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
9 a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)
10 ;
create or replace view userc.view
As
select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
to_char( c.expire_date,‘YYYYMMDD‘) expire_date
from usera.table_a c,userb.table_b a
where c.scheme_id = a.scheme_id and a.event_id=1
group by a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)
ORA-00942: 表或视图不存在
实际上表都是存在的并且SELECT部分使用USERC也是可以运行正常的,奇怪。后来试试显式赋权运行
SQL> grant all on usera.table_a to userc;
Grant succeeded
SQL> grant all on userb.table_b to userc;
Grant succeeded
SQL>
SQL> create or replace view userc.view
2 As
3 select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
4 to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
5 to_char( c.expire_date,‘YYYYMMDD‘) expire_date
6 from usera.table_a c,userb.table_b a
7 where c.scheme_id = a.scheme_id and a.event_id=1
8 group by a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
9 a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)
10 ;
View created
OK了,不知道是不是ORACLE的BUG还是本来就要求如此,查ORACLE手册
The owner of the view (whether it is you or another user) must have been
explicitly granted privileges to access all objects referenced in the view
definition. The owner cannot have obtained these privileges through roles
原本要求就是必须显式赋权,可惜ORACLE错误实在不够清楚
综上所述
我的理解是:
对于存储过程中的对象角色权限不能被直接使用,而需要显示的给相关的对象授权,否则存储过程编译会报错,如上述的存储过程内部需要select对象DEPT,当不显示的授给select权限时,哪怕当前用户有DBA角色,编译仍然报对象不存在的错误;
而当我们显示的授给用户相关权限时,过程编译正常
这里可以通过下面的三种方式显示授权:
1.GRANT SELECT ANY TABLE TO YUJX;
2.GRANT SELECT ON DEPT TO YUJX;
3.GRANT SELECT ANY TABLE TO PUBLIC或者GRANT SELECT ON DEPT TO PUBLIC;
说明
这里只是通过工作中遇到的一个问题引出了oracle的定义者权限相关内容,解决此问题过程中,我查阅了相关的资料,发现这是oracle的定义者和调用者权限的内容【上述问题就是定义者权限中的限制】;
大家如果有兴趣进一步研究下oracle定义者和调用者权限相关内容,请查阅相关资料进一步学习,或者可以看下Thomas Kyte的《oracle专家高级编程》中的第23章内