Oracle对DBA_ROLES的选择权限

时间:2013-02-28 16:10:21

标签: sql oracle privileges database-administration

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

用户是否缺少某些权限?为什么可以执行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

1 个答案:

答案 0 :(得分: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错误。