Пользователь схемы Oracle не может создать таблицу в процедуре - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать временную таблицу в процедуре:

PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
    tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
    -- sanity checks removed for readablity

    EXECUTE IMMEDIATE 
        'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
        'ON COMMIT PRESERVE ROWS AS ' ||
        'SELECT * FROM infop_stammdaten.bp';

END;

Если я скопирую блок BEGIN.._END в лист SQL, все работает нормально.Поэтому я думаю, что пользователь имеет право создать временную таблицу.Если я выполняю процедуру из той же таблицы SQL, я получаю

Fehlerbericht -
ORA-01031: Nicht ausreichende Berechtigungen
ORA-06512: in "INFOP_STAMMDATEN.PA_DELETE_FP", Zeile 16
ORA-06512: in Zeile 6
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to perform a database operation without
           the necessary privileges.
*Action:   Ask your database administrator or designated security
           administrator to grant you the necessary privileges

Строка 16 (Zeile 16), указывающая на статут EXECUTE IMMEDIATE, который создает временную таблицу.

Для меня это выглядит такпользователь не имеет таких же прав на рабочем листе sql, и когда он выполняет процедуру, процедура также находится в своей собственной схеме.

1 Ответ

0 голосов
/ 25 мая 2018

Ответ на ваш ближайший вопрос заключается в том, что вы получаете ORA-01031: insufficient privileges, поскольку у вашего пользователя есть привилегия CREATE TABLE, предоставленная через роль: модель безопасности Oracle применяет правило, согласно которому мы не можем использовать привилегии, предоставляемые через роли в PL / SQL.,Поэтому вам нужно, чтобы ваш администратор БД предоставил привилегию CREATE TABLE непосредственно вашему пользователю.

Или вам?

Потому что то, что вы пытаетесь сделать, не имеет смысла в Oracle.В Oracle глобальные временные таблицы являются постоянными структурами;это просто данные в них, которые являются временными.Итак, правильное решение - создать таблицу один раз с помощью обычного сценария DDL, как и любой другой объект базы данных.Затем вы можете просто вставить в глобальную временную таблицу, как вам нужно.

Вы не первый человек на этом сайте, который совершил эту ошибку ( прочитайте эту соответствующую ветку ).Часто это происходит из-за того, что люди приходят из другой базы данных, такой как SQL Server, которая имеет конструкцию, называемую «временная таблица», которая на самом деле отличается от глобальных временных таблиц Oracle.Если это ваш сценарий, то вас заинтересует новая функция Oracle 18c, которая называется Private Temporary Tables.Они в точности аналогичны временным таблицам SQL Server. Узнать больше .

...