2011-02-07 4 views
4


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

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


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


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

Select a from table_name where condition; 

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


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

+1

Множество возможностей: подключение к неправильной базе данных? Типо на имя таблицы? Вы должны дать нам больше, чтобы продолжить здесь. –

+0

Можете ли вы показать нам свою процедуру или инструкцию вставки? – CristiC

ответ

11

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

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

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

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

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

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

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

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

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

Create VIJAY.VIEW_A as SELECT * FROM TABLE_A 

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

Grant Select on TABLE_A to VIJAY. 

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

+0

Спасибо за подробное объяснение. Я пробовал вышеуказанные шаги, но так как я вошел в систему с тем же пользователем/владельцем, когда я запускаю команду Grant, она дает мне сообщение об ошибке «Can not Grant/revoke on own». –

+0

Ждать, процедура и таблица принадлежат и управляются одним и тем же пользователем? Это не имеет никакого смысла. Процедура в той же схеме, что и таблица, не имеет необходимых разрешений для таблицы. Можете ли вы отправить код процедуры из CREATE в BEGIN? –

1

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

+0

А также проверьте, использует ли пользователь/схему, которую вы используете для подключения к базе данных, достаточно прав, чтобы увидеть эту таблицу/представление. – Jonathan

+0

Не «права достаточно, чтобы видеть». Это можно сделать через роль. Как сказал Джастин, задайте роль none и THEN, если вы можете получить доступ к таблице. –

1

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

Проверьте:

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

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

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

+0

Хотя я прав, я сомневаюсь, что этот пользователь изменил Authid. Ответ Джастина более вероятен. Путаница над грантами через роль и непосредственность усугубляется запросом, работающим из командной строки sql, но не скомпилированным. –

8

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^