您的位置:首页 > 其它

存储过程中调用EXECUTE IMMEDIATE的“权限不足”问题

2012-09-12 13:33 681 查看
EXECUTE IMMEDIATE是Oracle中使用动态SQL的一种方法,可以直接执行,也可以在存储过程中调用。然而在存储过程中调用可能会遇到权限不足的问题,如在存储过程中执行建表语句:
CREATE
OR REPLACE procedure tableProc(tn
varchar2)
IS

sqlstr varchar2(100);

BEGIN

sqlstr :=
'CREATE TABLE ' || tn
||
'(id Integer)';

EXECUTE IMMEDIATE sqlstr;


END tableProc;

在命令行中执行返回如下结果:

SQL> EXECUTE tableProc('abc')

begin tableProc('abc'); end;

ORA-01031: 权限不足

ORA-06512: 在"SCOTT.TABLEPROC", line 5

ORA-06512: 在line 1

然而,如果我们直接在PL/SQL的语句执行,如下:

SQL> BEGIN

2 EXECUTE IMMEDIATE 'CREATE TABLE abc (ID INTEGER)';

3 END;

Table created

则提示执行成功。

这问题如何解决呢?

既然提示说权限不足,所以问题的解决方法就是要赋予用户scott Create Any Table的权限,以SYS登录,然后执行:

GRANT
CREATE ANY
TABLE TO SCOTT


再次执行以上的存储过程,成功了吧!

SQL> EXECUTE tableProc('abc');

PL/SQL procedure successfully completed

所以,如果在存储过程中调用EXECUTE IMMEDIATE出现“权限不足”问题,就需要赋予用户更多的权限,比如说在存储过程中创建或修改触发器遇到“权限不足”,就应该执行:

GRANT
CREATE ANY
TRIGGER TO SCOTT

其他情况也是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: