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

来源:互联网 发布:喷淋塔计算软件 编辑:程序博客网 时间:2024/05/16 08:28

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

2010123

14:09

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

 

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

 

代码如下:

Sql代码 复制代码 收藏代码
  1. create or replace procedure proc1   
  2.  (dno in number)   
  3.  is  
  4.  s varchar2(2000);   
  5.  begin  
  6.  s:='create table is_table   
  7.  (ids number)';   
  8.  dbms_output.put_line(s);   
  9.  execute immediate s;   
  10. end proc1;   
  11.     
  12. call proc1(20);  
 

 

2、解决过程

 

网友说的解决方法:

Sql代码 复制代码 收藏代码
  1. create or replace procedure p_create_table   
  2.     Authid Current_User is--加上Authid Current_User即可。  
  3.     begin  
  4.     Execute Immediate 'create table create_table(id int)';   
  5. end p_create_table;  
 

 

经在oracle10g/plsql7下验证成功。

 

3、原理探寻

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

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

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

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

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

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

 

4、总结:

 

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

Java代码 复制代码 收藏代码
  1. grant       
  2.   CREATE SESSION,   
  3.     CREATE ANY TABLE,   
  4.     CREATE ANY VIEW ,   
  5.     CREATE ANY INDEX,   
  6.     CREATE ANY PROCEDURE,   
  7.     CREATE ANY TABLE   
  8.      ALTER ANY TABLE,   
  9.     ALTER ANY PROCEDURE,     
  10.   DROP ANY TABLE,   
  11.     DROP ANY VIEW,   
  12.     DROP ANY INDEX,   
  13.     DROP ANY PROCEDURE,   
  14.   SELECT ANY TABLE,   
  15.     INSERT ANY TABLE,   
  16.     UPDATE ANY TABLE,   
  17.     DELETE ANY TABLE   
  18. to users;  
 

如此即可不添加Authid Current_User

 

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

原创粉丝点击