【发布时间】:2019-11-18 15:21:16
【问题描述】:
问题回顾:
为了在 oracle 中自动创建 PVJOURNAL 表的索引,我在一个包中编写了一个过程。 表 PVJOURNAL 位于 PROVIEW 模式中。我的 SPACEMAN 用户在该架构中有足够的授权。下面是包的 DDL:
CREATE OR REPLACE
PACKAGE spaceman.tmp_itcm4052 is
-- This proc rebuilds ALL indexes of a specific.
PROCEDURE idx_rebuild;
END;
/
CREATE OR REPLACE
PACKAGE BODY spaceman.tmp_itcm4052 is
-- ===========================================================================
PROCEDURE idx_rebuild as
-- This proc rebuilds ALL indexes of a specific table. Run by Job
v_sql_str VARCHAR2(200);
begin
FOR rec in (
select owner ||'.'|| index_name as IDX_NAME,
tablespace_name as TblSpace
from sys.all_indexes
where upper(index_type) = 'NORMAL'
and upper(table_owner) = 'PROVIEW'
and upper(table_name) in ('PVJOURNAL')
)
LOOP
v_sql_str := 'ALTER INDEX '||rec.IDX_NAME||' rebuild tablespace '
||rec.TblSpace||' online';
-- ALTER INDEX ... SHRINK SPACE COMPACT
-- ALTER INDEX ... DEALLOCATE UNUSED SHRINK SPACE COMPACT
dbms_output.put_line('v_sql_str = '||v_sql_str);
execute immediate v_sql_str;
commit;
END LOOP;
end idx_rebuild;
END tmp_ITCM4052;
/
问题本身:
问题是我的 SPACEMAN 用户下的程序调用
begin
spaceman.tmp_itcm4052.idx_rebuild;
end;
以错误结束
ORA-01031: 权限不足 - full view of the error
但是程序产生的直接运行的行保存到v_sql_str变量中,并由这段程序可视化:
dbms_output.put_line('v_sql_str = '||v_sql_str);,在同一个 SPACEMAN 用户下完成,就像魔法一样。 proof that direct alter does work
问题:
我对pl/sql之神做错了什么?为什么对过程的调用失败而直接执行相同的命令 - 不是?
UPD:不仅GRANT INDEX ON PROVIEW.PVJOURNAL TO SPACEMAN; 没有帮助。此外,出于我还不知道的原因,将任何索引授予 SPACEMAN;也没有帮助。
用
SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE upper(grantee) = 'SPACEMAN'
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE upper(rp.grantee) = 'SPACEMAN'
ORDER BY 1;
- 特权
ALTER ANY INDEX(以及ALTER ANY INDEXTYPE)在列表中。
UPD 1:事实证明,ALTER ANY INDEX 权限在这种情况下是不够的。对我有帮助的是@Wernfried Domscheit 提供的link。尊重,伙计!
过程创建为
CREATE OR REPLACE
PACKAGE spaceman.tmp_itcm4052 authid CURRENT_USER is
就像一个咒语。
【问题讨论】:
-
您从哪个用户调用该过程?
-
@Tejash - 过程调用和直接更改执行均在 spaceman 用户下完成。 spaceman.tmp_itcm4052 包也在 spaceman 的架构中。
标签: oracle plsql dynamic-sql ddl