使用存储过程用execute immediateSQL报ORA-01031错误问题的解决

使用存储过程用execute immediateSQLORA-01031错误问题的解决

2010123

14:09

  1. 遇到的问题及情况说明

 

  用normal用户登录时,在执行到 execute immediate s;时会出错:报:ORA-01031insufficient privileges 权限不足 错误,用sysDBA登录时则不会出错。

 

代码如下:

create or replace procedure proc1
 (dno in number)
 is
 s varchar2(2000);
 begin
 s:='create table is_table
 (ids number)';
 dbms_output.put_line(s);
 execute immediate s;
end proc1;
 
call proc1(20);
 

 

2、解决过程

 

网友说的解决方法:

create or replace procedure p_create_table
    Authid Current_User is--加上Authid Current_User即可。
    begin
    Execute Immediate 'create table create_table(id int)';
end p_create_table;
 

 

经在oracle10g/plsql7下验证成功。

 

3、原理探寻

 使用PLSQL Develeper可以发现Oracle对用户的授权分为五方面的权限,即:

一般权限:用于登录数据库

对象权限:用于给用户针对对象使用进行授权,以上的问题就是因为没有给对象授权造成。

角色权限:即操纵数据库的权限。

系统权限:管理oracle数据库运行的权限。

空间限额:限制用户空间大小。

 

4、总结:

 

  造成这个问题的原因在于用户的权限受到了限制。所以,按照这个逻辑,可以通过授权来解决此问题,即:

grant    
  CREATE SESSION,
    CREATE ANY TABLE,
    CREATE ANY VIEW ,
    CREATE ANY INDEX,
    CREATE ANY PROCEDURE,
    CREATE ANY TABLE
     ALTER ANY TABLE,
    ALTER ANY PROCEDURE,  
  DROP ANY TABLE,
    DROP ANY VIEW,
    DROP ANY INDEX,
    DROP ANY PROCEDURE,
  SELECT ANY TABLE,
    INSERT ANY TABLE,
    UPDATE ANY TABLE,
    DELETE ANY TABLE
to users;
 

如此即可不添加Authid Current_User

 

有不对的地方,还请指正。

你可能感兴趣的:(oracle,sql)