2

게시자와 구독자 간의 병합 중에 기본 키 충돌을 자동 해결할 수있는 방법을 제안 해주세요. 그것은 SQL Server가 상자 :(에서 그것을하지 않는 것 같다기본 키 병합 충돌을 자동으로 해결

충돌 뷰어 나에게 다음 메시지를 보여줍니다..

'_publisher_server_'에서 행 삽입이 '_subscriber_server_'로 전파 할 수없는이 실패는 제약 조건 위반으로 인해 발생할 수 있습니다. PRIMARY KEY 제약 조건 위반 'PK_ PartPlan _FD9D7F927172C0B5을'. 개체에 '_table_name_을'중복 키를 삽입 할 수 없습니다.

감사합니다.

답변

1

이 방법은 쉽지 않습니다. 데이터베이스를 자동으로 업데이트하는 int 키가 이미 설계되었으므로 기본 키에 GUID ("uniqueidentifier")를 사용하면 PK 충돌 문제가 해결됩니다.

+0

또는 더 나은 아직, 정의에 의해 고유 한 기본 키를 선택합니다. –

+0

은 역사적인 이유로 인해 이것을 할 수 없습니다. ( – spkenny

+0

@Vladislav : "자연스러운"기본 키는 존재할 때 좋지만 제 경험상 꽤 희귀합니다. (종종 이상적인 자연 키처럼 보이는 것이 중복 된 것입니다 어쨌든 사회 보장 번호처럼) – MusiGenesis

0

UPSERT (조건부 업데이트 또는 INSERT)를 수행하기 위해 WHEN MATCHED THENWHEN NOT MATCHED BY TARGET THEN을 사용해 보셨습니까?

문서는 here입니다.

기본 키가 두 DB의 동일한 항목을 나타내는 것으로 가정합니다.

+0

흠, 나는 좋은 경험이 없다. 복제. PK 충돌이 발생하면 위의 코드를 어떻게 든 실행할 수 있습니까? 이러한 종류의 충돌을 처리 할 수있는 일종의 자동 해결 프로그램을 작성할 수 있다면 (T-SQL 또는 C#) 훌륭합니다. 사용자 지정 해결 프로그램에 대해 알고 있지만이 충돌을 처리 할 수 ​​있습니까? 어쩌면 누군가가 전에 이것을했을 것입니까? – spkenny

+0

아마도 http://msdn.microsoft.com/en-us/library/ms147911.aspx? 그런 다음'InsertErrorHandler'를 구현할 수 있습니다. –

0

autonumer PK를 사용하여이 문제를 해결하는 가장 쉬운 방법은 자 동 번호 증가를 1에서 10 (또는 100 또는 1000)으로 변경 한 다음 모든 참가자에게 시드를 다르게 설정하는 것입니다.

그래서, 내가 시작할 수 씨 :
DB1 3
에서 DB3
2에서 DB2
1에서 ...
DBN
N에서 (N < 증가)

예 : 증가분이 100이면 PK 's가 생성됩니다. DB를 들면 :
DB1 ** 101, 201, 301 ...
DB2 ** 102, 202, 302 ...
DB3 ** 103, 203, 303 ..
INSERT ed 행의 수와 관계없이 최종 자릿수는 특정 데이터베이스를 반영하기 때문에 항상 고유 한 PK를 갖습니다.

이 방법은 구독자 수에 따라 필요에 따라 조정할 수 있으며 충돌하지 않으며 대리 키가 주어진 시점의 출처를 알 수있는 추가 이점이 있습니다.

기존 테이블의 경우 PK 시드와 간격을 스크립트로 재설정하면됩니다. 그것은 매우 쉽게해야합니다.


당신 당신은 또한 클러스터 된 인덱스에서 제거하지 않는 경우 특히, 가이드 PK를 사용하지만 GUID는 기본 키 상당히 문제가 될 수 있습니다 사용 할 수있다. 그들은 더 큽니다. 정수에 따라 코드가 이미있을 수 있습니다.

당신이 병합 복제를 만들

는, SQL 서버가 자동으로 변경 사항을 추적하기 위해 사용하는 GUID를 생성하지만 그들이 할 필요가 의미하는 것은 아니다 PK의