Запрос DBA_TABLES и USER_TABLES в PL SQL-курсоре

У меня есть курсор в процедуре PLSQL, чтобы выбрать из DBA_TABLES а также USER_TABLES,

CURSOR c1 IS
  SELECT DISTINCT(DB.TABLE_NAME) FROM DBA_TABLES DB, USER_TABLES UT WHERE DB.TABLE_NAME = UT.TABLE_NAME AND DB.IOT_TYPE IS NOT NULL;

BEGIN
  OPEN c1;
  FETCH c1  INTO IOT_TABLE;
  CLOSE c1;

Однако процедура жалоб

"ORA-00942 Таблица или Представление не существует"

во время выполнения.

1 ответ

Решение

Пользователь должен иметь привилегию SELECT для этого представления.
Чтобы проверить, имеет ли пользователь разрешение SELECT для этого представления, войдите в систему как этот пользователь и выполните следующий запрос:

select * from user_tab_privs WHERE table_name = 'DBA_TABLES';

Если этот запрос не возвращает ничего, то пользователь не имеет прав на это представление и не может его увидеть.


Чтобы предоставить эту привилегию этому пользователю, войдите в систему как SYS или SYSTEM и выполните:

GRANT select ON DBA_TABLES TO username;

После этого пользователь должен увидеть результат, как показано ниже, и будет иметь доступ к этому виду:

select table_name, privilege from user_tab_privs WHERE table_name = 'DBA_TABLES';

TABLE_NAME PRIVILEGE                               
---------- ---------
DBA_TABLES SELECT                                  

Следуйте инструкциям в ответе krokodilko, если вам просто нужно DBA_TABLES. ВSELECT ANY DICTIONARYпривилегия - еще один вариант, если вам нужно запросить несколько объектов словаря данных. Он предоставляет выборочный доступ к представлениям DBA (включая DBA_TABLES). Войдите как СИСТЕМА и запустите:

grant select any dictionary to your-username;

Привилегия SELECT ANY DICTIONARY позволяет пользователю запрашивать любой объект словаря данных в схеме SYS, за исключением: DEFAULT_PWD$, ENC$, LINK$, USER$, USER_HISTORY$ и XS$VERIFIERS.

Между прочим, курсор c1 в вопросе, вероятно, не нуждается в доступе к DBA_TABLES. Следующий запрос должен дать такой же результат:

CURSOR c1 IS
  SELECT TABLE_NAME FROM USER_TABLES WHERE IOT_TYPE IS NOT NULL;
Другие вопросы по тегам