트랜잭션 복제와 같은 병합 복제는 일반적으로 게시 데이터베이스 개체 및 데이터의 스냅샷으로 시작합니다. 게시자 및 구독자에서 수행한 후속 데이터 변경 및 스키마 수정은 트리거를 사용하여 추적됩니다. 구독자는 네트워크에 연결될 때 게시자와 동기화하고 마지막으로 동기화가 발생한 이후 게시자와 구독자 간에 변경된 모든 행을 교환합니다.
병합 복제는 일반적으로 서버-클라이언트 환경에서 사용됩니다. 병합 복제는 다음과 같은 경우에 적합합니다.
여러 구독자가 여러 번 동일한 데이터를 업데이트하고 해당 변경 내용을 게시자 및 다른 구독자에게 전파할 수 있습니다.
구독자는 데이터를 받고, 오프라인으로 변경하고, 나중에 변경 내용을 게시자 및 기타 구독자와 동기화해야 합니다.
각 구독자에는 다른 데이터 파티션이 필요합니다.
충돌이 발생할 수 있으며, 충돌이 발생할 경우 이를 감지하고 해결할 수 있는 기능이 필요합니다.
애플리케이션에는 중간 데이터 상태에 액세스하는 대신 순 데이터 변경이 필요합니다. 예를 들어 행이 게시자와 동기화되기 전에 구독자에서 5번 변경되는 경우 행은 게시자에서 한 번만 변경되어 순 데이터 변경(즉, 다섯 번째 값)을 반영합니다.
병합 복제를 사용하면 다양한 사이트가 자율적으로 작동하고 나중에 업데이트를 단일 균일한 결과로 병합할 수 있습니다. 둘 이상의 노드에서 업데이트가 이루어지므로 게시자와 둘 이상의 구독자가 동일한 데이터를 업데이트했을 수 있습니다. 따라서 업데이트가 병합될 때 충돌이 발생할 수 있으며, 병합 복제는 충돌을 처리하는 여러 방법을 제공합니다.
병합 복제는 SQL Server 스냅샷 에이전트 및 병합 에이전트에 의해 구현됩니다. 게시가 필터링되지 않거나 정적 필터를 사용하는 경우 스냅샷 에이전트는 단일 스냅샷을 만듭니다. 게시에서 매개 변수가 있는 필터를 사용하는 경우 스냅샷 에이전트는 데이터의 각 파티션에 대한 스냅샷을 만듭니다. 병합 에이전트는 초기 스냅샷을 구독자에 적용합니다. 또한 초기 스냅샷을 만든 후 게시자 또는 구독자에서 발생한 증분 데이터 변경 내용을 병합하고 구성한 규칙에 따라 충돌을 감지하고 해결합니다.
변경 내용을 추적하기 위해 병합 복제와 지연 업데이트 구독이 있는 트랜잭션 복제는 게시된 모든 테이블에 있는 모든 행을 고유하게 식별할 수 있어야 합니다. 이 병합 복제를 수행하기 위해 각 테이블에 열 rowguid을 추가합니다. 단, 테이블에 이미 데이터 형식 uniqueidentifier이면서 ROWGUIDCOL 속성이 설정된 열이 있는 경우 해당 열을 사용합니다. 테이블이 게시물에서 제거되면 rowguid 열이 삭제됩니다. 추적에서 사용한 기존 열은 삭제되지 않습니다. 필터에는 행을 rowguidcol 식별하기 위해 복제에 사용되는 필터가 포함되어서는 안 됩니다.
newid() 이 함수는 열에 rowguid 대한 기본값으로 제공되지만 고객은 필요한 경우 각 행에 대한 GUID를 제공할 수 있습니다. 그러나 값 00000000-0000-0000-0000-000000000000000을 제공하지 않습니다.
다음 다이어그램에서는 병합 복제에 사용되는 구성 요소를 보여 줍니다.