Доступ к таблице другого пользователя в хранимой процедуре Oracle

Я пишу хранимую процедуру для копирования данных из таблицы одного пользователя в другую схему. По сути, это серия операторов INSERT .. SELECT, например:

INSERT INTO GESCHAEFTE
  SELECT *
    FROM TURAT03.GESCHAEFTE
   WHERE kong_nr = 1234;

Это отлично работает при выпуске из sqlplus (или TOAD для меня ;-)), поэтому я знаю, что у меня есть достаточные привилегии, но когда это часть хранимой процедуры, например:

CREATE OR REPLACE FUNCTION COPY_KONG
    (pKongNr IN NUMBER)
    RETURN NUMBER
    AUTHID CURRENT_USER
IS
BEGIN
   INSERT INTO GESCHAEFTE
      SELECT *
       FROM TURAT03.GESCHAEFTE
       WHERE kong_nr = pKongNr;
END;

Я получаю ошибку Oracle:

[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist

Как видите, я уже вставил AUTHID, но безрезультатно.

Что еще я могу сделать? Я в значительной степени в конце своих идей здесь.


person Thorsten    schedule 09.12.2010    source источник


Ответы (1)


Владелец процедуры должен иметь право прямого доступа к базовым объектам, не через роль. Чтобы иметь тот же уровень доступа, что и ваши процедуры, используйте следующие команды:

SET ROLE NONE;

Чтобы получить доступ к другой таблице из процедуры, вам нужно предоставить SELECT напрямую, а не через роль:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

Эта статья Тома Кайта содержит дополнительную информацию.

person Vincent Malgrat    schedule 09.12.2010
comment
Спасибо, Винсент, быстрый ответ! Я смог напрямую предоставить выбор моему пользователю, и теперь он работает. - person Thorsten; 09.12.2010
comment
Это очень странное поведение, у кого-нибудь есть ссылка на то, почему это так. - person Reimius; 20.05.2015
comment
@reimius: Мы можем только догадываться, почему, поскольку в документации обычно не упоминается причина перехода к конкретной реализации. Возможно, Oracle решил не поддерживать связь зависимостей между процедурами и ролями, потому что это может привести к массовой декомпиляции, влияющей на многие схемы при изменении роли. - person Vincent Malgrat; 21.05.2015
comment
Ваше объяснение имеет большой смысл. - person Reimius; 21.05.2015