这个错误好像经常出现呀,网上搜了一圈头都晕了。
我现在有这样的存储过程:create or replace procedure xxx is
beginexecute immediate 'create table hello_0(serv_id number(12) not null)';end xxx;
PS:单独执行那个create table是没有问题的这个过程创建成功后我执行了execute xxx;
然后出现了提示ORA-01031: insufficient privileges
ORA-06512: at "INTERFACE.XXX", line 4
ORA-06512: at line 2按说的话,我是有创建表的权限的,但是提示权限不足。
另外两个错误就很晕了,完全不明白是什么意思。请高手帮忙分析一下!!
我现在有这样的存储过程:create or replace procedure xxx is
beginexecute immediate 'create table hello_0(serv_id number(12) not null)';end xxx;
PS:单独执行那个create table是没有问题的这个过程创建成功后我执行了execute xxx;
然后出现了提示ORA-01031: insufficient privileges
ORA-06512: at "INTERFACE.XXX", line 4
ORA-06512: at line 2按说的话,我是有创建表的权限的,但是提示权限不足。
另外两个错误就很晕了,完全不明白是什么意思。请高手帮忙分析一下!!
create or replace procedure xxx is
beginexecute immediate 'drop table hello_0';execute immediate 'create table hello_0(serv_id number(12) not null)';end xxx;
ORA-01031: insufficient privileges
ORA-06512: at "INTERFACE.XXX", line 6
ORA-06512: at line 2
把我解决这个问题的资料贴上来分享一下吧。终于找到毛病了,原来是没有权限。虽然当前用户执行语句是有权限的,但是放到存储过程中就必须要显式的赋个权限给当前用户。以下是我找到的资料,贴出来给大家也看一下吧。
=====================
【IT168 技术文档】我们知道,用户拥有的role权限在存储过程是不可用的。如: SQL> select * from dba_role_privs where grantee='SUK'; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------ ------------ ------------ ------------
SUK DBA NO YES
SUK CONNECT NO YES
SUK RESOURCE NO YES --用户SUK拥有DBA这个role --再创建一个测试存储过程:
create or replace procedure p_create_table
is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table; --然后测试
SQL> exec p_create_table; begin p_create_table; end; ORA-01031: 权限不足
ORA-06512: 在"SUK.P_CREATE_TABLE", line 3
ORA-06512: 在line 1 --可以看到,即使拥有DBA role,也不能创建表。role在存储过程中不可用。
--遇到这种情况,我们一般需要显式进行系统权限,如grant create table to suk;
--但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程
--实际上,oracle给我们提供了在存储过程中使用role权限的方法:
--修改存储过程,加入Authid Current_User时存储过程可以使用role权限。
create or replace procedure p_create_table
Authid Current_User is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table; --再尝试执行:
SQL> exec p_create_table; PL/SQL procedure successfully completed --已经可以执行了。