使用存储过程用execute immediateSQL报ORA-01031错误问题的解决
2010年12月3日
14:09
用normal用户登录时,在执行到 execute immediate s;时会出错:报:ORA-01031:insufficient privileges 权限不足 错误,用sys,DBA登录时则不会出错。
代码如下:
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。
有不对的地方,还请指正。