作为系统用户,我遇到此错误:ORA-01031:权限不足

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作为系统用户,我遇到此错误:ORA-01031:权限不足相关的知识,希望对你有一定的参考价值。

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

我在系统用户上安装了存储过程。当我测试过程时,出现以下错误:'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;

嗯,当我以系统身份执行存储过程时,我不明白出现此错误的原因。而且我认为尝试删除分区时最终会想到相同的错误。

非常感谢您在这个问题上为我提供帮助。

答案

在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>

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

另一答案

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

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

请参阅此链接以获取更多详细信息:Execute immediate within Oracle Procedure

以上是关于作为系统用户,我遇到此错误:ORA-01031:权限不足的主要内容,如果未能解决你的问题,请参考以下文章

IMP-00003: 遇到 ORACLE 错误 1031 ORA-01031: 权限不足

ORA-01031 创建视图时

ORA-01031 尽管不是触发器

Oracle ORA-01031: 创建用户时权限不足

ORA-01031: 权限不足

sqlplus/rman登录报权限错误ORA-01031/ORA-04005/0RA-00554