Oracle:将ON DELETE CASCADE添加到按引用分区使用的外键中

时间:2017-05-24 14:22:30

标签: oracle partitioning cascading-deletes

当与PARTITION BY REFERENCE一起使用时,是否可以将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;

1 个答案:

答案 0 :(得分:0)

我认为ALTER...MODIFY中没有选项可以使内联选项成为现存的约束级联;我认为你确实需要删除并重新创建或等效。

我也同意,看起来没有干净的方法来删除和重新创建分区引用约束;我相信你将面临重新定位的目标。

更糟糕的是,看起来12c中提供的DBMS_REFEFINITION增强功能无法通过DBMS_REDEFINITION doesn't support参考分区获得良好的一步式重新设置

我认为你需要做一个老派的活动。 (用手工制作的替代品尝试一些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