2017-05-24 3 views
0

PARTITION BY REFERENCE와 함께 사용되는 경우 분할 키로 사용되는 외래 키에 ON DELETE CASCADE를 추가 할 수 있습니까? 나는 이미 나가는 테이블에 대해 말하고있다.오라클 : 참조로 파티션에 사용 된 외래 키에 ON DELETE CASCADE를 추가하십시오.

내 솔루션은 제약 조건을 삭제하고 다시 만들지 만 PARTITION BY REFERENCE에서 사용되는 제약 조건을 삭제할 수 없기 때문에 작동하지 않습니다. 작업을 참조 파티션 테이블

오라클 11g에서 지원되지 : ORA-14650 :

나는 SQL 오류가 발생합니다. 나는 현존하는 제약 폭포를 만들기 위해 인라인 옵션 ALTER...MODIFY에는 옵션이없는 생각

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

; 나는 당신이 진정으로 떨어 뜨리고 재창조해야한다고 생각합니다.

또한 동의합니다. 파티션 참조 제약 조건을 삭제하고 다시 만들 수있는 깨끗한 방법이없는 것 같습니다. 나는 네가 거기에 도달하기위한 재 정의에 직면 할 것이라고 믿는다.

1294에서 사용할 수있는 DBMS_REFEFINITION 개선 사항이 DBMS_REDEFINITIONdoesn'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); 

다음 이동 읽기 전용 :

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

그런 다음 스왑합니다

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

그런 다음 YY_TEMP를 동기화 :

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 
관련 문제