我有一个执行EXCHANGE SUBPARTITION
语句的过程。
根据架构中的所有表都有VPD POLICY
保护的事实,
我们有一个存储过程,EXEMPT ACCESS POLICY
它在操作之前授予用户并在操作之后撤销它。
通常它工作得很好,但有时,我们仍然会遇到这个异常:
ORA-14136: ALTER TABLE EXCHANGE 受细粒度安全性限制
即使在我们给予资助之后,它也会发生。
例子:
交换子分区代码:
-- exchange subpartition statement
--ALTER TABLE DWH.FACT_AMS EXCHANGE SUBPARTITION P07_2017_ALL_AUDIT WITH TABLE DWH.MNG_ALL_CURRENT_KPIS
V_EXEC_I :=Q_CUR.SQL_QUERY;
--insert to log the exchage partition step
LOG_WRITER_INS(V_EXEC_I,V_ERROR_MSG,V_COMMENT_MSG,V_MASTER,C_PROCESS_NAME,C_PID);
-- execute exchange subpartition statement
DBA_MAINT.SF_GRANT_EXCEMPT(1);
EXECUTE IMMEDIATE V_EXEC_I;
DBA_MAINT.SF_GRANT_EXCEMPT(0);
sf_grant_excempt 程序:
create or replace
procedure SF_GRANT_EXCEMPT(grant_opt in number)
is
v_cnt number := -1;
begin
if grant_opt = 1 then
EXECUTE IMMEDIATE 'GRANT EXEMPT ACCESS POLICY TO dwh';
ELSIF GRANT_OPT = 0 THEN
EXECUTE IMMEDIATE 'REVOKE EXEMPT ACCESS POLICY from dwh';
END IF;
END SF_GRANT_EXCEMPT;
它可以发生在不同的表上(这是一个动态的过程),但是语句中涉及的表总是属于同一所有者(总是dwh),EXCHANGE SUBPARTITION
同一用户的包的代码也是(dwh) ,并且我们得到的异常不是来自 SF_GRANT_EXCEMPT 过程。因此,赠款正在发挥作用...