Пользователь схемы Oracle не может создать таблицу в процедуре

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

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, и когда он выполняет процедуру, процедура также находится в своей собственной схеме.


person BetaRide    schedule 25.05.2018    source источник
comment
Вы должны указать следующее: 1. Вы запускаете это с тем же пользователем в той же базе данных/контейнере? 2. Если пользователь тот же - уверены ли вы, что инструкция проходит и выполняется (на листе)? 3. Я вижу ошибку в строке 16 INFOP_STAMMDATEN.PA_DELETE_FP — это пакет, содержащий процедуру pr_create_tmp_bp_table? 4. Самое главное - есть ли у вашего пользователя привилегия CRATE TABLE?   -  person g00dy    schedule 25.05.2018


Ответы (1)


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

Или ты?

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

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

person APC    schedule 25.05.2018
comment
Хорошо, я попробовал GRANT CREATE TABLE TO INFOP_STAMMDATEN; в качестве пользователя схемы. К сожалению, я снова получаю ORA-01031: insufficient privileges. - person BetaRide; 25.05.2018
comment
Пользователь, которого вы используете, не имеет опции WITH GRANT, поэтому ему не разрешено передавать свою привилегию CREATE TABLE другим пользователям. Вот почему я предложил вам привлечь администратора баз данных. - person APC; 25.05.2018
comment
@BetaRide Я не уверен, что вы подразумеваете под GRANT CREATE TABLE TO INFOP_STAMMDATEN; как пользователь схемы. Является ли пользователь схемы INFOP_STAMMDATEN? Вы не можете просто предоставить системные привилегии себе, если это то, что вы пытаетесь сделать. - person William Robertson; 25.05.2018
comment
У меня такая же проблема с обрезанием таблицы другого пользователя. Я предоставил пользователю DROP ANY TABLE, но это не решило проблему. Я все еще получаю недостаточно прав - person Amir; 14.06.2021
comment
@Amir - усечение таблицы, принадлежащей другому пользователю, - это другая проблема. Я предлагаю вам задать новый вопрос, предоставив как можно больше подробностей. Вероятно, на этот вопрос уже был дан ответ на этом сайте, но трудно сказать без дополнительной информации о том, чего именно вы пытаетесь достичь. - person APC; 14.06.2021
comment
@ Амир, ах, извините, я вижу, вы задали вопрос. Я постараюсь ответить на него. - person APC; 14.06.2021