2017-05-24 135 views
0

当与PARTITION BY REFERENCE一起使用时,是否可以将ON DELETE CASCADE添加到用作分区键的外键?我正在谈论一个已经退出的桌子。Oracle:通过引用将ON DELETE CASCADE添加到分区中使用的外键

我的解决方案是删除约束并重新创建它,但它不起作用,因为我无法删除由PARTITION BY REFERENCE使用的约束。

我得到 SQL错误:ORA-14650:不支持参考分区表

的Oracle 11g操作。

drop table y; 
drop table x; 
create table x (a number primary key) partition by hash (a); 
create table y (a number not null, 
    constraint y_x_fk foreign key(a) references x(a)) 
    partition by reference(y_x_fk); 
alter table y drop constraint y_x_fk; 
+0

东西我没有变:你想将y_x_fk约束更改为删除级联?你说你不能删除它?你确定? –

+0

是的,我试图删除约束时得到了ORA-14650。该表通过引用进行分区,并且此FK是分区键,您不能只放弃这样的约束。 – rattaman

回答

0

我相信这是在ALTER...MODIFY到内联选项,以使现存的约束级联别无选择;我认为你确实需要丢弃和重建,或者相当于。

我也同意,它看起来像没有干净的方式来删除和重新创建分区引用约束;我相信你会面临重新确定去那里。

更糟的是,它看起来像12c中可用的DBMS_REFEFINITION增强功能不会让您在一个很好的一步redef,因为DBMS_REDEFINITIONdoesn't support参考分区。

我认为你需要做一个老派的redef。 (它仍然值得尝试一些DBMS_REDEFINITION与手工更换,但我会准备至少一点停机时间)。

像下面的例子一样的方法可以让你在那里(停机时间)。根据您的可用性需求,其他方法可以最大限度地减少此示例中的停机时间。

进行替换表所需CASCADING FK

create table y_temp (a number not null, 
    constraint y_temp_x_fk foreign key(a) references x(a) ON DELETE CASCADE) 
partition by reference(y_temp_x_fk); 

然后去只读:

ALTER TABLE X READ ONLY; 
ALTER TABLE Y READ ONLY; 

然后同步YY_TEMP

INSERT INTO Y_TEMP SELECT Y.A FROM Y; 
COMMIT; 

然后进行交换:

ALTER TABLE Y RENAME TO Y_OLD; 
ALTER TABLE Y_TEMP RENAME TO Y; 
DROP TABLE Y_OLD; 
ALTER TABLE Y RENAME CONSTRAINT y_temp_x_fk TO y_x_fk; 

而且带的东西备份的WRITE

ALTER TABLE X READ WRITE; 

然后对其进行测试:

INSERT INTO X VALUES (1); 
INSERT INTO Y VALUES (1); 

SELECT * FROM Y; 

A 
1 

DELETE FROM X; 

1 row deleted. 

和级联:

SELECT * FROM Y; 

no rows selected