在线重定义表导致constraint变成novalidate

[复制链接]
查看11 | 回复6 | 2010-10-8 09:28:51 | 显示全部楼层 |阅读模式
以前没注意过,今天发现在线重定义表会导致constraint变成novalidate。
解决方法很简单,就是在dbms_redefinition.copy_table_dependents之后enable validate 中间表的这个constraint。
写出来引起大家注意。
SQL> create table test1 tablespace DATA01 as select * from dba_objects;
Table created.

SQL> alter table test1 add constraint test1_pk primary key(object_id);
Table altered.

SQL> create table test2 tablespace SYSTEM as select * from dba_objects where 1=2;
Table created.

SQL> select constraint_name, status, VALIDATED from user_constraints where table_name = 'TEST1';
CONSTRAINT STATUS
VALIDATED
---------- ------------------------ ---------------------------------------
TEST1_PK ENABLED
VALIDATED
SQL> exec dbms_redefinition.can_redef_table( USER, 'TEST1', DBMS_REDEFINITION.CONS_USE_PK) ;
PL/SQL procedure successfully completed.

SQL> exec dbms_redefinition.START_REDEF_TABLE(USER, 'TEST1', 'TEST2', NULL, DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL procedure successfully completed.

var v_num number
begin
dbms_redefinition.copy_table_dependents(USER, 'TEST1', 'TEST2', dbms_redefinition.cons_orig_params, true, true, true, true, :v_num, true);
dbms_output.put_line('error number: ' || :v_num);
end;
/
error number: 0
SQL> select constraint_name, status, VALIDATED from user_constraints where table_name = 'TEST1';
CONSTRAINT STATUS
VALIDATED
---------- ------------------------ ---------------------------------------
TEST1_PK ENABLED
VALIDATED

SQL> select constraint_name, status, VALIDATED from user_constraints where table_name = 'TEST2';
CONSTRAINT STATUS
VALIDATED
---------- ------------------------ ---------------------------------------
TMP$$_TEST ENABLED
NOT VALIDATED
1_PK0

***这时你发现中间表的constraint并没有validate,所以如果你直接finish redefinition的话,新的表会有novalidate的constraint。
***当然这样其实没多大问题,但是如果这个表时分区表,将来做exchange partition时要注意这点,否则会报ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION。
解决办法很简单:
SQL> alter table TEST2 enable validate primary key;
Table altered.

SQL>select constraint_name, status, VALIDATED from user_constraints where table_name = 'TEST2';
CONSTRAINT STATUS
VALIDATED
---------- ------------------------ ---------------------------------------
TMP$$_TEST ENABLED
VALIDATED
1_PK0
SQL> exec dbms_redefinition.sync_interim_table( USER, 'TEST1', 'TEST2');
PL/SQL procedure successfully completed.
SQL> exec dbms_redefinition.finish_redef_table( USER, 'TEST1', 'TEST2');
PL/SQL procedure successfully completed.
SQL> select constraint_name, status, VALIDATED from user_constraints where table_name = 'TEST1';
CONSTRAINT STATUS
VALIDATED
---------- ------------------------ ---------------------------------------
TEST1_PK ENABLED
VALIDATED

如果以前没注意到的同学注意了。
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
nice
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
请问一下LZ您的代码是如何贴进去的,如此公正。
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
Great


回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
原帖由 killkill_shadow 于 2010-7-2 09:42 发表
请问一下LZ您的代码是如何贴进去的,如此公正。

字体改成宋体
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
多谢楼主,还真发现有几个REDEFINITION后无效的主键。
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
原帖由 sundog315 于 2010-7-2 09:58 发表

字体改成宋体

哦,好的,顺便测试一下:

[email protected] SQL> desc resources;
Name
Null?Type
----------------------------------------------------------------- -------- --------------------------------------------
ID
NOT NULL NUMBER
SOURCEID
VARCHAR2(20)
CATALOGID
NUMBER
TYPE
VARCHAR2(20)
STATE
NUMBER(2)
SITE
VARCHAR2(50)
ORDERLINE
NUMBER(20)
URL
VARCHAR2(200)
ISLEAD
NUMBER(1)
WORKFLOW
NOT NULL NUMBER(1)
WORKFLOWID
NUMBER
TEMPLATEID
NUMBER
RELATETYPE
NUMBER
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行