Oracle 9i: Синонимная таблица не существует? - PullRequest
2 голосов
/ 19 декабря 2008

Я создал пакет, который содержит хранимую процедуру, которую я планирую вызвать из отдельного приложения. Хранимая процедура вернет отсортированный список всех представлений и таблиц в схеме. Для этого он выполняет простой выбор по синонимам 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 («FROM DBA_TABLES»).

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

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

Ответы [ 3 ]

7 голосов
/ 19 декабря 2008

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

4 голосов
/ 19 декабря 2008

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

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

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

2 голосов
/ 19 декабря 2008

Редактировать: Извините, я затмил ту часть, где вы, кажется, говорите, что вы можете выбрать из DBA_TABLES напрямую. Скорее всего, проблема в том, что ваши привилегии предоставляются через роль, на которую ответил кто-то другой. Но все же стоит объяснить, что ваше понимание синонимов PUBLIC неполно и что использование ALL_TABLES было бы лучше, если бы оно выполняло то, что вам нужно.

Синоним PUBLIC означает, что все пользователи могут ссылаться на синоним; он не предоставляет им никакого доступа к объекту, на который ссылается синоним.

Что бы вы могли сделать для непосредственного решения этой ошибки - предоставить привилегию SELECT для представлений SYS пользователям, которые будут выполнять эту процедуру. Тем не менее, я думаю, что это очень плохая идея.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...