Обнаружена ошибка: таблица или представление не существует - PullRequest
4 голосов
/ 07 февраля 2011


Я использую оператор вставки и пытаюсь вставить данные в таблицу базы данных. Я использую хранимые процедуры.
Но я получаю эту ошибку при этом.

Сообщение: ORA-00942: таблица или представление не существует ORA-06512


Я проверил, есть ли таблицы / хранимые процедуры или нет, и все на месте. Также нет опечаток в именах таблиц или в sp. Если я запускаю часть SP из редактора запросов, она работает нормально, но когда я выполняю весь SP, он выдает ошибку.


Я попытался выполнить шаги, предоставленные Стивеном, но, поскольку я вошел в систему с тем же пользователем / владельцем, когда я запускаю команду «Предоставить», появляется сообщение об ошибке «Cannot Grant / revoke on own».
Еще одно дополнение к этому. У меня есть хранимая процедура SP1, в которой я использую оператор выбора как

Select a from table_name where condition;

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


Может кто-нибудь помочь мне решить эту проблему. Я использую SQL +.
заранее спасибо Виджей

Ответы [ 5 ]

11 голосов
/ 08 февраля 2011

Ответ Джастина верен, но позвольте мне немного расширить.

Все, кто сказал, что таблицы не существует, не читали весь ваш пост. Так как вы можете:

Если я запускаю часть SP из редактора запросов, она работает нормально

Очевидно, что таблица там. Очевидно, у вас есть доступ к нему. В противном случае это не сработает, когда оно явно работает.

но когда я выполняю весь SP, он выдает ошибку.

Это связано с тем, что Oracle различает разрешения, предоставленные напрямую, и разрешения, предоставляемые через роль.

Скажи, что я делаю это:

Create Table TABLE_A
Create Role READ_ONLY
Grant Select on TABLE_A to READ_ONLY
Grant READ_ONLY to VIJAY

В окне / приглашении SQL вы можете запросить эту таблицу без проблем. Так что теперь вам нужно создать представление

Create VIJAY.VIEW_A as SELECT * FROM TABLE_A

Вы получите ошибку, что TABLE_A существует. Поскольку представление компилируется, как процедура, она выполняется без каких-либо ролей. Поскольку он работает без роли READ_ONLY, он не учитывает тот факт, что TABLE_A существует. Теперь, что мне нужно сделать, это

Grant Select on TABLE_A to VIJAY.

Теперь, когда у вас есть прямое разрешение, вы можете скомпилировать представление или процедуру / пакет, которые используют эту таблицу.

8 голосов
/ 08 февраля 2011

Существует ли таблица в схеме, где существует хранимая процедура?Если нет, самое простое объяснение состоит в том, что владельцу вашей процедуры был предоставлен доступ к таблице через роль, а не через прямое предоставление.Хранимая процедура определителя прав должна иметь прямой доступ к объектам, к которым она обращается.Быстрый способ проверить это - отключить роли для сеанса, например

SQL> set role none;
SQL> <<execute your query>>

. Если это приводит к ошибке, проблема заключается в отсутствии прямого предоставления.

3 голосов
/ 07 февраля 2011

В Oracle вы можете выбрать, будет ли хранимая процедура выполняться с правами инициатора или определителя: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/subprograms.htm#i18574

Проверьте, является ли свойство AUTHID хранимой процедуры правильным, и если полученный пользователь имеетсоответствующие разрешения.

1 голос
/ 07 февраля 2011

Как сказал Джо Стефанелли ... у этой ошибки есть много возможностей.

Проверьте:

  1. Вы подключаетесь к правильному экземпляру Oracle.
  2. У вас есть разрешения для запроса или выполнения обработки таблицы, на которую вы ссылаетесь в своем запросе.
  3. Существует разница между обычными операторами выбора и процедурами. Процедуры в оракуле не уважают роли, назначенные пользователю; скорее, разрешение должно быть явно предоставлено пользователю. Для получения дополнительной информации прочитайте следующую ссылку ORA-00942
1 голос
/ 07 февраля 2011

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

...