2013-02-28 2 views
1

Я подключен к базе данных Oracle 10g с пользовательским «пользователем», когда я запускаю select на DBA_ROLES, он отображает результат без каких-либо проблем, но когда выбор находится внутри процедуры, он возвращает ошибку ORA -00942: таблица или вид не существуетOracle select privilege on 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 через роль, а не через прямой грант. Скорее всего, вы можете попросить администратора базы данных предоставить ваш счет в 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