SQL> create table p ( 2 n number primary key 3 ) partition by list (n) 4 ( 5 partition p1 values (1) 6 ); Table created SQL> create table r1 (n number not null); Table created SQL> create table r2 ( 2 n number not null, 3 constraint fk_r$n foreign key (n) referencing p (n) 4 ) partition by reference (fk_r$n); Table created SQL> exec dbms_redefinition.start_redef_table(user, 'R1', 'R2', options_flag => dbms_redefinition.cons_use_rowid); PL/SQL procedure successfully completed SQL> exec dbms_redefinition.finish_redef_table(user, 'R1', 'R2'); PL/SQL procedure successfully completed SQL> select status, validated from user_constraints where constraint_name='FK_R$N'; STATUS VALIDATED -------- ------------- DISABLED NOT VALIDATEDThe annoying part comes when you realize that you can't do anything about it (at least not by normal means):
SQL> alter table r1 enable constraint FK_R$N; alter table r1 enable constraint FK_R$N ORA-14650: operation not supported for reference-partitioned tables SQL> alter table r1 enable novalidate constraint FK_R$N; alter table r1 enable novalidate constraint FK_R$N ORA-14650: operation not supported for reference-partitioned tablesSurprisingly enough the constraint actually works as far as reference partitioning is concerned. However, it results in an "unclean" status which can't be fixed! Of course the view just shows us what we have in cdef$:
SQL> select con#, enabled, defer 2 from sys.cdef$ 3 where con# = 4 (select con# 5 from sys.con$ 6 where owner#=(select user# from sys.user$ where name=user) 7 and name= 'FK_R$N' 8 ); CON# ENABLED DEFER ---------- ---------- ---------- 10997 512ENABLED set to NULL will decode to DISABLED while the following results in NOT VALIDATED:
SQL> select decode(bitand(512, 4), 4, 'VALIDATED', 'NOT VALIDATED') VALIDATED from dual; VALIDATED ------------- NOT VALIDATEDSo what we really need is ENABLED set to 1 and DEFER set to 516. Of course, playing with the data dictionary in such a way is a big no-no on production system without blessing of Oracle support, but since I'm on my sandbox database I'll give it a shot:
SQL> update cdef$ set enabled=1, defer=516 where con#=10997; 1 row updated. SQL> commit; Commit complete. SQL> startup force ORACLE instance started. Total System Global Area 400846848 bytes Fixed Size 2228784 bytes Variable Size 146804176 bytes Database Buffers 243269632 bytes Redo Buffers 8544256 bytes Database mounted. Database opened. SQL> select status, validated from user_constraints where constraint_name='FK_R$N'; STATUS VALIDATED -------- ------------- ENABLED VALIDATEDLooks like it worked :) Note that there is practically no way for a reference partitioning constraint to be either disabled or not validated -- the rows have to go somewhere, after all, so we don't introduce any logical inconsistencies by setting cdef$ values to what they really should be.
Footnote:
The bug number for this one is 13572659.
There is another related issue:
ReplyDeleteBug 13526773 Constraint becomes NOT VALIDATED after table is redefined by DBMS_REDEFINITION