- 遇到的问题及情况说明
用normal用户登录时,在执行到 execute immediate s;时会出错:报:ORA-01031:insufficient privileges 权限不足 错误,用sys,DBA登录时则不会出错。
代码如下:
Sql代码
- 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、解决过程
网友说的解决方法:
Sql代码
- 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、总结:
造成这个问题的原因在于用户的权限受到了限制。所以,按照这个逻辑,可以通过授权来解决此问题,即:
Java代码
- 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。
有不对的地方,还请指正。