2013-02-28 25 views
1

我用用户“user”连接到Oracle 10g数据库,当我在DBA_ROLES上运行选择时,它显示结果没有任何问题,但是当选择在过程中时,它返回错误ORA -00942:表或视图不存在Oracle对DBA_ROLES的选择权限

是缺少一些权限的用户?为什么有可能执行SELECT而不是将其包含在过程中?

SQL> SELECT COUNT(*) FROM DBA_ROLES; 

    COUNT(*) 
---------- 
     18 

SQL> CREATE OR REPLACE PROCEDURE tst_role IS 
    v VARCHAR2(100); 
BEGIN 
     v := ''; 
     FOR rec IN (SELECT ROLE FROM DBA_ROLES) LOOP 
       v := rec.role; 
       DBMS_OUTPUT.put_line(v); 
     END LOOP; 
END; 
/
Warning: Procedure created with compilation errors. 

SQL> show errors 
Errors for PROCEDURE TST_ROLE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/13  PL/SQL: SQL Statement ignored 
5/30  PL/SQL: ORA-00942: table or view does not exist 
6/3  PL/SQL: Statement ignored 
6/8  PLS-00364: loop index variable 'REC' use is invalid 

回答

7

在定义者权限存储过程中,您无权访问通过角色授予的权限。这很可能意味着您正在使用的任何Oracle用户都可以通过角色而不是通过直接授权访问DBA_ROLES。最有可能的,你可以在你的会话禁用角色和验证你问你的DBA授予您的帐户SELECT ANY DICTIONARY特权

GRANT SELECT ANY DICTIONARY 
    TO your_oracle_user 

您可以验证的问题是,事实上,这项特权通过角色授予得到一个错误。如果你

SQL> set role none; 
SQL> SELECT COUNT(*) FROM DBA_ROLES; 

我打赌你会得到相同的ORA-00942错误。

+0

我发送给DBA,现在我的问题已修复,谢谢! – mcha 2013-02-28 17:15:09