2013-02-28 22 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