ora1031 on create table inside 立即执行
ora1031 on create table inside execute immediate
我有创建对象的程序 krn_ddl_mgr,所以 creatin 看起来像这样:
begin
krn_ddl_mgr.create_object('create table krn_modules
(
id varchar2(30 byte),
description varchar2(4000 byte)
)
tablespace MDLDATA
rowdependencies');
end;
/
并抛出ora1031权限不足异常。该程序中只有立即执行操作
procedure create_object(p_sql in clob) is
begin
execute immediate p_sql;
dbms_output.put_line('create_object done');
exception
when others then
case
when (lower(p_sql) like ('create%')) and sqlcode = -955 or sqlcode = -2264 then
null;
when lower(p_sql) like ('alter% primary %') and sqlcode = -2260 or sqlcode = -2261 then
null;
when lower(p_sql) like ('alter% check %') and sqlcode = -2264 then
null;
when lower(p_sql) like ('alter% references %') and sqlcode = -2275 then
null;
else
raise;
end case;
end create_object;
当我不使用过程而只使用 create table 或 create table 时,它可以在 execute immediate 语句中使用。我尝试创建的 create_object 过程和 table 也在一个模式中。为什么会这样?
我猜 krn_ddl_mgr
的所有者已被授予通过角色创建 table 的权限。
问题是通过角色授予的权限在 PL/SQL 内部不活跃。您需要将必要的权限直接授予包的所有者,而不是通过角色。
我有创建对象的程序 krn_ddl_mgr,所以 creatin 看起来像这样:
begin
krn_ddl_mgr.create_object('create table krn_modules
(
id varchar2(30 byte),
description varchar2(4000 byte)
)
tablespace MDLDATA
rowdependencies');
end;
/
并抛出ora1031权限不足异常。该程序中只有立即执行操作
procedure create_object(p_sql in clob) is
begin
execute immediate p_sql;
dbms_output.put_line('create_object done');
exception
when others then
case
when (lower(p_sql) like ('create%')) and sqlcode = -955 or sqlcode = -2264 then
null;
when lower(p_sql) like ('alter% primary %') and sqlcode = -2260 or sqlcode = -2261 then
null;
when lower(p_sql) like ('alter% check %') and sqlcode = -2264 then
null;
when lower(p_sql) like ('alter% references %') and sqlcode = -2275 then
null;
else
raise;
end case;
end create_object;
当我不使用过程而只使用 create table 或 create table 时,它可以在 execute immediate 语句中使用。我尝试创建的 create_object 过程和 table 也在一个模式中。为什么会这样?
我猜 krn_ddl_mgr
的所有者已被授予通过角色创建 table 的权限。
问题是通过角色授予的权限在 PL/SQL 内部不活跃。您需要将必要的权限直接授予包的所有者,而不是通过角色。