Вставка данных в таблицу в другую схему из материализованного представления с использованием процедуры в Oracle - PullRequest
0 голосов
/ 20 марта 2019

Я пытался вставить данные из материализованного представления в таблицу, которая принадлежит другой схеме, используя процедуру, но когда я компилирую процедуру, я получаю ошибку: таблица или представление не существует. Я проверил, и у меня есть права выбора и вставки в этой таблице. create or replace PROCEDURE PROCEDURE_MYPROCEDURE AS BEGIN INSERT INTO SCHEME.TABLE (COLUMN1,COLUM2) SELECT COLUMN1,COLUMN2 FROM MATERIALIZED_VIEW; END PROCEDURE_MYPROCEDURE;

эта строка SCHEME.TABLE показывает сообщение "PL / SQL: ЗАЯВЛЕНИЕ ЗАЯВЛЕНО", "ТАБЛИЦА ИЛИ ВИДА НЕ СУЩЕСТВУЕТ"

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Если процедура скомпилирована для пользователя a и MATERIALIZED_VIEW принадлежит пользователю b.Когда вы выполните процедуру, она будет искать материализованное представление для пользователя a.

Поместите пользователя / схему перед MATERIALIZED_VIEW.Вам также необходимо предоставить пользователю select на MATERIALIZED_VIEW a.

0 голосов
/ 20 марта 2019

Наиболее вероятной причиной является то, что у вас есть доступ через роль не напрямую, что означает, что вы можете запускать ее в SQL, но для процедуры PLSQL вам нужна прямая привилегия.

Согласно руководству разработчика приложений:

Права, необходимые для создания процедур и функций Чтобы создать отдельную процедуру или функцию, или спецификацию пакета или Тело, вы должны соответствовать следующим предпосылкам: Вы должны иметь системную привилегию CREATE PROCEDURE, чтобы создать процедура или пакет в вашей схеме, или СОЗДАТЬ ЛЮБОЙ Системная привилегия PROCEDURE для создания процедуры или пакета в схема другого пользователя. Внимание: создать без ошибок, то есть скомпилировать процедуру или пакет успешно, требует следующих дополнительных привилегий: Владелец процедуры или пакета должен быть явно предоставил необходимые объектные привилегии для всех объектов, на которые есть ссылки тело кода; владелец не может получить требуемый привилегии через роли. Если привилегии владельца процедуры или пакета меняются, процедура должны быть повторно аутентифицированы перед выполнением. Если необходимая привилегия для указанный объект отзывается у владельца процедуры (или пакета), процедура не может быть выполнена.

Простой способ проверить вещи:

SQL> set role none;
SQL> "statement you want to test to see if it'll work in a procedure"

Так что вы можете просто пропустить некоторые прямые гранты для этих объектов.

...