2017-05-24 133 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