적용 대상:SQL Server
참고
SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
기본적으로 병합 복제는 데이터 변경을 행 단위로 처리합니다. 많은 상황에서 이 접근법이 적절하지만, 일부 응용 분야에서는 관련 행을 하나의 단위로 처리하는 것이 필수적입니다. Merge Replication의 논리 레코드 기능은 서로 다른 테이블 내 관련 행 간의 관계를 정의하여 행들이 하나의 단위로 처리되도록 할 수 있게 합니다.
참고
논리 레코드 기능은 단독으로 사용하거나 조인 필터와 함께 사용할 수 있습니다. 조인 필터에 대한 자세한 내용은 Join Filters를 참조하세요. 논리적 레코드를 사용하려면 게시의 호환성 수준이 90RTM 이상이어야 합니다.
다음 세 가지 관련 테이블을 살펴봅니다.
Customers 테이블은 이 관계의 부모 테이블이며 기본 키 열 CustID가 있습니다. Orders 테이블에는 기본 키 열 OrderID가 있으며 Customers 테이블의 CustID 열을 참조하는 FOREIGN KEY 제약 조건이 이 테이블의 CustID 열에 있습니다. 유사하게 OrderItems 테이블에는 기본 키 열 OrderItemID가 있으며 Orders 테이블의 OrderID 열을 참조하는 FOREIGN KEY 제약 조건이 이 테이블의 OrderID 열에 있습니다.
이 예제에서 논리적 레코드는 단일 CustID 값과 관련된 Orders 테이블의 모든 행과, Orders 테이블의 행과 관련된 OrderItems 테이블의 모든 행으로 구성됩니다. 이 다이어그램은 Customer2의 논리적 레코드에 있는 세 테이블의 모든 행을 보여 줍니다.
아티클 간의 논리적 레코드 관계를 정의하려면 병합 테이블 아티클 간의 논리적 레코드 관계 정의를 참조 하세요.
논리 기록의 장점
논리적 레코드 기능에는 두 가지 주요 이점이 있습니다.
데이터 변경 사항을 하나의 단위로 적용합니다.
여러 테이블의 여러 행에서 동시에 충돌을 감지하고 해결합니다.
변화를 단위로 적용하는 방법
병합 처리가 연결 끊김 등의 이유로 중단되면, 논리 레코드를 사용하는 경우 관련된 복제 변경 사항의 부분적으로 완료된 집합이 롤백됩니다. 예를 들어 구독자가 OrderID = 6인 새 주문과 OrderID = 6에 대해 OrderItemID = 10 및 OrderItemID = 11인 두 개의 새 행을 OrderItems 테이블에 추가하는 경우를 살펴봅시다.
복제 과정이 OrderID = 6의 Orders 행이 완료된 후, OrderItems 10과 11이 완료되기 전에 중단되고 논리 레코드가 사용되지 않은 경우, OrderID = 6의 OrderTotal 값은 OrderItems 행의 OrderAmount 값 합과 일치하지 않습니다. 논리 레코드를 사용할 경우, OrderID = 6의 Orders 행은 관련 OrderItems 변경이 복제될 때까지 커밋되지 않습니다.
다른 시나리오에서는 논리 레코드를 사용하는 경우, 병합 프로세스가 변경 사항을 적용하는 동안 누군가 테이블을 조회하더라도 사용자는 일부만 복제된 변경 사항을 모두 완료될 때까지는 볼 수 없습니다. 예를 들어, 복제 프로세스는 OrderID = 6의 Orders 행을 업로드하지만, 사용자가 복제 프로세스가 OrderItems 행을 복제하기 전에 테이블을 조회할 때, OrderTotal 값은 OrderAmount 값의 합과 같지 않습니다. 논리 레코드를 사용할 경우, OrderItems 행이 완료되고 트랜잭션이 단위로 커밋될 때까지 Orders 행이 보이지 않습니다.
충돌 처리를 두 개 이상의 테이블에 적용하기
두 구독자가 이전 데이터 세트를 가지고 있는 경우를 생각해 봅시다:
첫 번째 구독자의 사용자는 OrderItemID 5의 OrderAmount를 100에서 150으로, OrderID 3의 OrderTotal을 200에서 250으로 변경합니다.
두 번째 구독자의 사용자는 OrderItemID 6의 OrderAmount를 25에서 125로, OrderID 3의 OrderTotal을 200에서 300으로 변경합니다.
이러한 변경 사항이 논리 레코드를 사용하지 않고 복제된다면, 서로 다른 OrderTotal 값들이 충돌하여 그 중 하나만 복제됩니다. 하지만 OrderItems 테이블에서 충돌하지 않는 변경 사항은 충돌 없이 복제되어, 최종 OrderTotal 값은 OrderItems 행에 대해 일관되지 않는 상태가 됩니다. 이 시나리오에서 논리 레코드를 사용할 경우, 손실된 Orders 테이블 변경과 관련된 OrderItems 변경도 롤백되며, 최종 OrderTotal 값은 OrderItems 행의 정확한 요약이 됩니다.
논리적 레코드를 사용하는 경우의 충돌 감지 및 해결과 관련된 옵션에 대한 자세한 내용은 Detecting and Resolving Conflicts in Logical Records을 참조하세요.
논리 레코드 사용 시 고려사항
논리적 레코드 사용 시 다음 사항을 고려하십시오.
일반적인 고려 사항
논리 기록의 테이블 수를 최대한 적게 유지하세요. 테이블 5개 이하로 사용하세요.
논리 레코드는 다음 데이터 타입 중 어느 것도 포함하지 않는 열을 참조할 수 없습니다:
varchar(max) 및 nvarchar(max)
varbinary(max)
text 및 ntext
image
XML
UDT
CASCADE 옵션을 사용해서 공개된 테이블에서 외래 키 관계를 정의할 수 없습니다. 자세한 내용은 CREATE TABLE (Transact-SQL) 및 ALTER TABLE (Transact-SQL)를 참조하세요.
논리 관계 절에 사용되는 열은 업데이트할 수 없습니다.
비즈니스 로직 핸들러나 커스텀 리졸버를 이용한 맞춤형 충돌 해결은 논리 레코드에 포함된 문서에는 지원되지 않습니다.
매개변수화된 필터를 포함하는 출판물에서 논리 레코드를 사용할 경우, 각 구독자를 파티션에 맞게 스냅샷으로 초기화해야 합니다. 다른 방법으로 구독자를 초기화하면 병합 에이전트가 실패합니다. 자세한 내용은 매개 변수화된 필터가 있는 병합 게시용 스냅샷을 참조하세요.
논리적 기록과 관련된 충돌은 충돌 뷰어에 나타나지 않습니다. 이러한 충돌에 대한 정보를 보려면 복제 저장 프로시저를 사용합니다. 자세한 내용은 병합 게시에 대한 충돌 정보 보기(복제 Transact-SQL 프로그래밍)를 참조하세요.
출판 환경
게시의 호환성 수준은 90RTM 이상이어야 합니다. 자세한 내용은 복제 이전 버전과의 호환성의 "게시 호환성 수준" 섹션 을 참조하세요.
게시는 네이티브 스냅샷 모드를 사용해야 합니다. 이 모드는 기본 모드이며, 논리 레코드를 지원하지 않는 SQL Server Compact로 복제하지 않는 한 그렇습니다.
출판물은 웹 동기화를 허용할 수 없습니다. 웹 동기화에 대한 자세한 내용은 Web Synchronization for Merge Replication를 참조하십시오.
필터링된 출판물에서 논리 레코드를 사용하려면:
또한 미리 계산된 파티션을 사용해야 합니다. 사전 계산 파티션의 요구 사항은 논리적 레코드에도 적용됩니다. 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하세요.
비중첩 매개변수화된 필터는 사용할 수 없습니다. 자세한 내용은 매개 변수가 있는 행 필터의 "파티션 옵션 설정" 섹션을 참조하세요.
출판물이 조인 필터를 사용하는 경우, 논리 레코드 관계에 관련된 모든 조인 필터에 대해 조인 고유 키 속성을 true 로 설정해야 합니다. 자세한 내용은 Join Filters를 참조하세요.
테이블 간 관계
논리적 레코드를 통해 관련된 테이블에는 기본 키-외래 키 관계가 있어야 합니다.
외래키 제약 조건에 대해 NOT FOR REPLICATION 옵션을 설정할 수 없습니다.
자식 테이블에는 부모 테이블이 하나만 있을 수 있습니다.
예를 들어 데이터베이스 추적 클래스 및 학생은 다음과 유사한 디자인을 가질 수 있습니다.
이 관계에서 세 테이블을 모두 나타내기 위해 논리 레코드를 사용할 수 없습니다. 왜냐하면 ClassMembers 의 행들이 단일 기본 키 행과 연관되어 있지 않기 때문입니다. ClassMembers 테이블과 Students 테이블 간에 논리적 레코드를 만들 수 있듯이 Classes 테이블과 ClassMembers테이블 간에도 논리적 레코드를 만들 수 있지만 이 3개의 테이블 간에는 논리적 레코드를 만들 수 없습니다.
출판물에는 순환 조인 필터 관계를 포함할 수 없습니다.
Customers, Orders, OrderItems 테이블 예시를 보면, Orders 테이블에 OrderItems 테이블을 참조하는 외래키 제약 조건이 있으면 논리 레코드를 사용할 수 없습니다.
논리적 레코드의 성능 영향
논리 기록 기능은 성능 비용이 따릅니다. 논리 레코드를 사용하지 않는다면, 복제 에이전트가 주어진 문서의 모든 변경 사항을 동시에 처리할 수 있습니다. 변경 사항이 행별로 적용되기 때문에, 변경 적용에 필요한 잠금 및 트랜잭션 로그 요구사항이 최소화됩니다.
논리 레코드를 사용할 경우, 병합 에이전트는 각 전체 논리 레코드의 변경 사항을 함께 처리해야 합니다. 이 과정은 병합 에이전트가 행을 복제하는 데 걸리는 시간에 영향을 미칩니다. 또한 에이전트가 각 논리적 레코드에 대해 별도의 트랜잭션을 열기 때문에 잠금 요구 사항이 증가할 수 있습니다.