Запрос 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;