Вопрос

Я создал пакет, содержащий хранимую процедуру, которую я планирую вызвать из отдельного приложения.Хранимая процедура вернет отсортированный список всех представлений и таблиц в схеме.Для этого он выполняет простой выбор синонимов DBA_TABLES и DBA_VIEWS, как показано ниже:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

Я проверил, что синонимы, о которых идет речь, существуют и являются общедоступными:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

Насколько я понимаю, поскольку они являются общедоступными, мне не нужны никакие дополнительные разрешения, чтобы получить к ним доступ.Если это понимание неверно, я хотел бы, чтобы кто-нибудь разубедил меня в этом понятии и указал на более точные данные.

Теперь вот в чем моя проблема:Я могу открыть рабочий лист в Oracle SQL Developer и просто отлично выбрать из этих таблиц.Я просто отлично получаю значимые данные (на самом деле, 567 строк).Но когда я пытаюсь выполнить хранимую процедуру, Oracle выдает ошибку компиляции, как показано ниже:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

Когда я дважды щелкаю по этому второму сообщению об ошибке, SQL Developer переводит меня к первому предложению FROM ("ИЗ DBA_TABLES").

Так что я в полном замешательстве.Я довольно хорошо знаю SQL Server, и я новичок в Oracle, поэтому, пожалуйста, потерпите меня.Если бы вы могли дать какие-нибудь подсказки или указать мне правильное направление, я был бы действительно признателен вам.

Заранее спасибо!

Это было полезно?

Решение

Используйте ALL_TABLES и ALL_VIEWS вместо DBA_TABLES и DBA_VIEWS.Просмотры ALL_% должны быть доступны всем пользователям.

Другие советы

Если вы выбираете из таблицы или представления в сохраненной PL / SQL-процедуре или сохраненной PL / SQL-функции, вам требуется прямое предоставление.Предоставления через роль базы данных недостаточно.

Вероятно, вам нужен прямой грант на просмотр dba_tables.(общедоступные) синонимы - это просто (общедоступные) синонимы.Вам нужно напрямую предоставить права выбора.

Смотрите здесь: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

Редактировать: Извините, я умолчал о той части, где вы, кажется, говорите, что можете выбирать непосредственно из DBA_TABLES.Скорее всего, проблема в том, что ваши привилегии предоставляются через роль, как ответил кто-то другой.Но все же стоит объяснить, что ваше понимание ОБЩЕДОСТУПНЫХ синонимов является неполным, и что использование ALL_TABLES было бы лучше, если бы оно выполняло то, что вам нужно.

Синоним, являющийся ОБЩЕДОСТУПНЫМ, означает только то, что все пользователи могут ссылаться на синоним;это не предоставляет им никакого доступа к объекту, на который ссылается синоним.

Что бы вы сделали, чтобы самым непосредственным образом устранить эту ошибку, так это предоставили привилегию ВЫБОРА в системных представлениях пользователю (ам), который будет выполнять эту процедуру.Тем не менее, я думаю, что это очень плохая идея.

Как предложил Раймондс, подумайте, можете ли вы вместо этого получить то, что вам нужно, из USER_TABLES или ALL_TABLES .Какой пользователь вызывает эту процедуру и какой доступ у этого пользователя к таблицам SONAR5?

Как правило, если ваше приложение заинтересовано в таблице, предположительно, у него есть некоторые привилегии в отношении нее, и в этом случае она должна быть указана в ALL_TABLES.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top