оракул "таблица или представление не существует" из хранимой процедуры - PullRequest
8 голосов
/ 16 ноября 2010

сценарий такой ...

У меня есть пространство имен XXX, где я создал несколько таблиц и некоторые хранимые процедуры ...

У них есть пространство имен YYY, где они создали несколько таблиц ...

им предоставлен XXX доступ к их таблицам, поэтому, когда я подключаюсь к SQL Developer с использованием соединения XXX, я могу сделать:

SELECT * FROM YYY.TableA

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

CREATE OR REPLACE PROCEDURE PRC_SOMESP(
) AS BEGIN
END PRC_SOMESP;

Процедуры, которые не обращаются к таблицам YYY, хорошо компилируются.

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

После ответа Джастина Кейва я пытаюсь добавить предложение "AUTHID CURRENT_USER" в sp, но получаю тот же результат "таблица или представление не существует":

CREATE OR REPLACE PROCEDURE PRC_PROC1( PARAMETERS... )  
AUTHID CURRENT_USER  
AS  
    MYVAR NUMBER;  
BEGIN  
    STATEMENTS...
END PRC_PROC1;  

CREATE OR REPLACE PACKAGE PKG_PROC2  
AUTHID CURRENT_USER  
AS  
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE PRC_PROC2( PARAMETERS... )  
END PKG_PROC2  

Должен ли я проверить что-нибудь еще?

Ответы [ 3 ]

11 голосов
/ 16 ноября 2010

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

В SQL Developer относительно легко проверить, что это проблема.Если вы запустите команду

SET ROLE none

, а затем запустите инструкцию SELECT, я ожидаю, что вы получите ту же ошибку ORA-00942.

Если это так, решение будеткак правило, стоит попросить, чтобы владельцы таблиц в схеме YYY предоставили доступ к таблицам непосредственно вам, а не предоставили доступ через роль.За исключением этого, вы можете определить свою хранимую процедуру как хранимую процедуру прав инициатора, добавив AUTHID CURRENT_USER в объявление.Это означало бы, что вызывающая процедура должна иметь доступ к базовым объектам, но это позволит вашим процедурам использовать привилегии, предоставляемые через роль.

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

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

, если бы вы хотели хранимую процедуру прав вызывающего, которая запрашивала таблицу TableA в схеме XXX.

0 голосов
/ 27 марта 2017

У меня была такая же проблема.Я не администратор баз данных, но, как мне объяснили, это так: «Основным является то, что привилегии вашей личной роли не действуют в рамках хранимой процедуры».

Мне посоветовали уточнить имя SP с владельцем таблиц, например:

CREATE OR REPLACE PROCEDURE yyy.PRC_PROC1( PARAMETERS... ) etc

Это сработало в моем случае в моей среде разработки.В моей среде только одно пространство имен, поэтому я не уверен, что это решит вопрос ОП, но, надеюсь, поможет продвинуть эту проблему вперед для следующих 18 тысяч человек, которые ищут этот вопрос; -).

Кроме того, когдаЯ запустил свой SP в производство, мне нужно будет удалить классификатор, и наше установочное программное обеспечение запустится create с соответствующими полномочиями.

0 голосов
/ 16 ноября 2010

В хранимых процедурах схемы XXX, если вы обращаетесь к таблицам из схемы YYY, убедитесь, что вы полностью их квалифицировали:

select count(1) from YYY.TableA;

Другая вещь, которую следует учитывать, - это регистр (в случае, когда вы смешиваете прописные и строчные буквы в своих идентификаторах Oracle).

И последнее: опубликуйте полученную ошибку. Так тебе будет легче помочь.

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