비Oracle 데이터베이스에 대한 병렬 Replicat 제한
상위의 기본 키와 연관된 외래 키 열 인덱스의 순서가 다르면 parellel Replicat가 실패합니다. 즉, 상위에 조합 primary key가 있는 경우 하위 테이블에서 참조하는 foreign key의 순서가 primary key와 다른 경우 병렬 Replicat가 비정상 종료됩니다.
예:
CREATE TABLE atstgt.tgt (
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
num INT,
) PRIMARY KEY(pk1, pk2);
CREATE TABLE atstgt.child (
id INT NOT NULL,
pk2 VARCHAR(10) NOT NULL,
pk1 VARCHAR(20) NOT NULL,
details VARCHAR(100),
CONSTRAINT fk_child FOREIGN KEY (pk1, pk2) REFERENCES atstgt.tgt (pk1, pk2) ON DELETE CASCADE ON UPDATE CASCADE) PRIMARY KEY(id);
이 예에서 상위의 기본 키(atstgt.tgt)는 위치 1에 pk1, 위치 2에 pk2를 가집니다. 그러나 하위 테이블에서는 서수 위치가 반전되고 pk1 서수 위치 3은 pk2's 서수 위치 2 뒤에 옵니다. 이로 인해 ROW NOT FOUND 오류가 있는 병렬 Replicat에서 간헐적인 실패가 발생합니다.
이러한 문제가 발생하지 않도록 하려면 다음 예제와 같이 Foreign Key 열의 인덱스가 상위 테이블의 조합 Primary Key 열 순서와 비교할 때 하위 테이블에서 동일한 순서로 정렬되어야 합니다.
CREATE TABLE atstgt.tgt (
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
num INT,
) PRIMARY KEY(pk1, pk2);
CREATE TABLE atstgt.child (
id INT NOT NULL,
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
details VARCHAR(100),
CONSTRAINT fk_child FOREIGN KEY (pk1, pk2) REFERENCES atstgt.tgt (pk1, pk2) ON DELETE CASCADE ON UPDATE CASCADE) PRIMARY KEY(id);