Выполнение DDL изнутри PL / SQL не выполняется - PullRequest
0 голосов
/ 27 мая 2020

Я выполняю DDL изнутри сохраненного pro c:

v_sql_stmt := 'ALTER INDEX PK_TEST REBUILD ONLINE';
EXECUTE IMMEDIATE (v_sql_stmt);

Все объекты - индекс, таблица (на которой построен индекс) и pro c ( с двумя приведенными выше строками) принадлежат одной схеме. Кроме того, при выполнении сохраненного pro c я вхожу в ту же схему и выполняю pro c как владелец.

Однако каждый раз, когда я запускаю его, я получаю сообщение об ошибке: ORA -01031: недостаточные привилегии для этого оператора

У меня был администратор базы данных, предоставивший привилегии CREATE ANY TABLE и CREATE ANY INDEX явно пользователю, потому что PL / SQL не может разрешить гранты, предоставленные через роли.

Но я все еще получаю ошибку в этой строке после грантов. Другие части pro c работают нормально, как я могу видеть из трассировки dbms_output в различных точках.

Кто-нибудь может помочь с идеями?

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Вы должны предоставить ALTER ANY INDEX или ALTER INDEX для указанного c индекса.

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

Здесь небольшой тестовый пример с Oracle 12.1 EE:

SQL> --
SQL> select banner from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

SQL> create user myuser identified by "myuser" quota unlimited on users;

User created.

SQL> grant create session, create table, create procedure to myuser;

Grant succeeded.

SQL> connect myuser/myuser
Connected.

Session altered.

SQL> show user
USER is "MYUSER"
SQL> create table mytable as select * from all_objects where object_id < 1000;

Table created.

SQL> create index myindex on mytable(object_name);

Index created.

SQL> create procedure myproc
  2  as
  3  begin
  4   execute immediate 'alter index myindex rebuild online';
  5  end;
  6  /

Procedure created.

SQL> show errors
No errors.
SQL> exec myproc;

PL/SQL procedure successfully completed.

SQL> show errors
No errors.
SQL> 
0 голосов
/ 27 мая 2020

Когда я удалил предложение ONLINE из оператора ALTER INDEX, оно работает без ошибок. Не понимаю почему !!! Но доволен его работой: (* ​​1001 *

0 голосов
/ 27 мая 2020

Единственный вывод, который я могу сделать, это то, что по крайней мере один из приведенных вами фактов на самом деле не соответствует действительности. Позвольте мне перефразировать изложенные факты:

A) Индекс, таблица и процедура находятся в одной схеме

B) Вы подключаетесь к этой схеме для выполнения процедуры

Если A и B оба истинны, вам не нужны какие-либо определенные c предоставленные привилегии для выполнения команды rebuild

C) Администратор баз данных предоставил CREATE ANY TABLE, CREATE ANY INDEX и ALTER ANY INDEX (согласно комментарию к другому ответу) для этого пользователя

Эти привилегии должны быть актуальны только в том случае, если A и B оба не являются истинными. Если оба они не верны и задействованы как минимум две схемы, то какой из них администратор баз данных предоставил привилегии для

D) Ошибка

вызывается командой ALTER INDEX.

Если A, B и C верны, то я должен подозревать, что D не

Чтобы исключить возможности, было бы хорошо показать убедительные доказательства этих факты - т.е. результаты запроса, которые демонстрируют, что они верны.

Я бы также попробовал выполнить ALTER как отдельную команду и в анонимном блоке. Это, по крайней мере, прояснит, является ли выполнение этой процедуры частью проблемы.

...