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

本文解决了一个Oracle数据库中因权限不足导致的错误。当普通用户尝试创建表时出现ORA-01031错误,通过调整PL/SQL过程并授予必要的系统权限解决了该问题。

  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

 

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


http://oracle.group.javaeye.com/group/blog/832652

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值