Как получить доступ к системным таблицам Oracle изнутри функции или процедуры PL / SQL? - PullRequest
5 голосов
/ 08 апреля 2010

Я пытаюсь получить доступ к информации из таблицы метаданных Oracle из функции. Например (намеренно упрощено):

CREATE OR REPLACE PROCEDURE MyProcedure
IS
    users_datafile_path VARCHAR2(100);
BEGIN
    SELECT file_name INTO users_datafile_path
        FROM dba_data_files
        WHERE tablespace_name='USERS'
        AND rownum=1;
END MyProcedure;
/

Когда я пытаюсь выполнить эту команду в процессе sqlplus, я получаю следующие ошибки:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: SQL Statement ignored
6/12     PL/SQL: ORA-00942: table or view does not exist

Я знаю, что у пользователя есть доступ к таблице, потому что, когда я выполняю следующую команду из того же процесса sqlplus, он отображает ожидаемую информацию:

SELECT file_name
    FROM dba_data_files
    WHERE tablespace_name='USERS'
    AND rownum=1;

Что приводит к:

FILE_NAME
--------------------------------------------------------------------------------
/usr/lib/oracle/xe/oradata/XE/users.dbf

Есть ли что-то, что мне нужно сделать по-другому?

Ответы [ 4 ]

4 голосов
/ 08 апреля 2010

Убедитесь, что SELECT не только распространяется через роль , но и что пользователь действительно имеет грант. Гранты по ролям не распространяются на пакеты. См. сообщение на сайте asktom.oracle.com .

Также попробуйте sys.dba_data_files вместо dba_data_files.

1 голос
/ 28 октября 2015

Укажите WITH GRANT OPTION, чтобы разрешить грантополучателю предоставлять объектные привилегии другим пользователям и ролям.

GRANT SELECT ON dba_data_files TO YOUR_USER WITH GRANT OPTION;
0 голосов
/ 06 марта 2012

Для выбора данных из dba_data_files предоставьте выбор от пользователя SYS до ПОЛЬЗОВАТЕЛЯ. Пример:

GRANT SELECT ON dba_data_files TO YOUR_USER;

После этого перекомпилируйте вашу Процедуру.

0 голосов
/ 08 апреля 2010

Вы пробовали префикс имени таблицы с sys. как в

FROM sys.dba_data_files
...