0

我有一个用于删除分区的存储过程。在开始之前,我必须删除一个约束。

我在系统用户上安装了存储过程。当我测试该过程时,出现此错误:'ORA-01031: 权限不足'

这是我写的一段代码:

BEGIN

    EXECUTE IMMEDIATE 'ALTER TABLE USER_NAME.TABLE_NAME DISABLE CONSTRAINT CONSTRAINT_NAME';

EXCEPTION
    WHEN OTHERS THEN

        O_sCodError := 'NO_OK';
        O_sDesError := 'Error at DISABLE CONSTRAINT_NAME: ' || SQLERRM || ';';

        RETURN;

END;

好吧,当我作为系统执行存储过程时,我不明白我有这个错误的原因。而且我认为当我尝试删除分区时,我最终会想到同样的错误。

4

3 回答 3

0

在 11g XE 上为我工作:

SQL> show user
USER is "SCOTT"
SQL>
SQL> create table test
  2    (id     number   constraint pk_test primary key,
  3     name   varchar2(20)
  4    );

Table created.

SQL> connect system
Enter password:
Connected.
SQL> begin
  2    execute immediate 'alter table scott.test disable constraint pk_test';
  3    return;
  4  end;
  5  /

PL/SQL procedure successfully completed.

SQL>

请按照该示例并在您的数据库中执行它。发布结果(通过编辑问题,而不是作为评论)。

于 2020-05-29T20:51:47.807 回答
0

您必须授予 SYSTEM 帐户直接权限(不具有角色)才能在目标表上运行 ALTER TABLE,因为默认情况下在存储过程中未启用角色:https ://asktom.oracle.com/Misc/RolesAndProcedures.html 。

尝试:

grant alter any table to system;

或者

grant alter table on user_name.table_name to system;
于 2020-05-29T21:06:41.000 回答
0

首先,您永远不应该在像 SYSTEM 这样的 Oracle 默认模式中安装自定义代码。将您的代码放在专用的应用程序架构中。由于它包含动态 SQL(立即执行),您可能需要考虑将其设为“调用者权限”过程,然后将其执行权限授予将执行它的用户。

也就是说,在 Oracle 11g 中,使用特权运行 PL/SQL 块的任何人都必须对基础表具有直接权限,而不是通过像 DBA 这样的角色继承权限。如果该过程具有“定义者的权限”,那么拥有该过程的模式必须对表具有直接权限。如果是“调用者的权限”,那么执行该过程的用户必须具有权限。

有关更多详细信息,请参阅此链接: 在 Oracle 过程中立即执行

于 2020-05-29T20:57:31.167 回答