从 PL/SQL 内部执行 DDL 失败



我正在从存储的进程内部执行DDL:

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

所有对象 - 索引、表(在其上构建索引(和 proc(具有上述 2 行(都属于同一架构。此外,在执行存储的过程时,我登录到相同的架构并以所有者身份执行过程。

但是,每次运行它时,我都会收到错误:ORA-01031:此语句的权限不足

我已经将DBA授予"创建任何表"和"创建任何索引"权限明确授予用户,因为PL/SQL可能无法解析通过角色授予的授权。

但是在赠款之后,我仍然在这一行中遇到错误。过程的其他部分执行正常,正如我从不同点的dbms_output跟踪中看到的那样。

任何人都可以帮忙提出想法吗?

您必须授予更改任何索引或更改特定索引的索引。

但是,如果该过程默认由索引的所有者创建,并且该过程也由同一用户运行,则无需授予任何其他权限。

下面是一个使用 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> 

我能看到的唯一结论是,你陈述的事实中至少有一個實際上不是真的。让我重新表述一下陈述的事实:

A( 索引、表和过程都在同一个架构中

B( 您正在连接到该架构以执行该过程

如果 A 和 B 都为真,则不需要任何特定的授予权限来执行重建命令

C( DBA 已授予该用户创建任何表、创建任何索引和更改任何索引(根据对其他答案的评论(

仅当 A 和 B 不都为真时,这些特权才应相关。如果它们不是两个都为真,并且至少涉及两个模式,则 DBA 授予权限是哪一个

D( 是 ALTER INDEX 命令抛出错误

如果 A、B 和 C 为真,那么我不得不怀疑 D 不是

为了消除可能性,最好展示这些事实的确凿证据 - 即证明它们是真实的查询结果。

我还会尝试将 ALTER 作为独立命令并在匿名块中执行。这至少可以澄清通过过程执行它是否是问题的一部分。

当我从 ALTER INDEX 语句中删除 ONLINE 子句时,它可以正常工作。 不明白为什么!! 但很高兴它的工作:(

相关内容

  • 没有找到相关文章

最新更新