논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화
적용 대상: SQL Server
참고 항목
SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
기본적으로 병합 복제는 행 단위로 데이터 변경 내용을 처리합니다. 대부분의 경우 이 작업이 적절하지만 일부 애플리케이션의 경우 관련 행을 한 단위로 처리해야 합니다. 병합 복제의 논리적 레코드 기능을 사용하면 서로 다른 테이블에 있는 관련 행 간의 관계를 정의하여 이러한 행을 하나의 단위로 처리할 수 있습니다.
참고 항목
논리적 레코드 기능은 단독으로 또는 조인 필터와 함께 사용할 수 있습니다. 조인 필터에 대한 자세한 내용은 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 값의 합계와 일치하지 않습니다. 논리적 레코드를 사용하는 경우 관련된 OrderItems 변경 내용이 복제될 때까지 OrderID = 6의 Orders 행이 커밋되지 않습니다.
다른 시나리오에서 논리적 레코드를 사용하고 병합 프로세스에서 변경 내용을 적용할 때 누군가가 테이블을 쿼리하는 경우 사용자는 모두 완료될 때까지 부분적으로 복제된 변경 내용을 볼 수 없습니다. 예를 들어 복제 프로세스에서 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를 참조하십시오.
필터링된 게시에서 논리적 레코드를 사용하려면 다음을 수행합니다.
사전 계산 파티션도 사용해야 합니다. 사전 계산 파티션의 요구 사항은 논리적 레코드에도 적용됩니다. 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하세요.
겹치지 않는 매개 변수가 있는 필터는 사용할 수 없습니다. 자세한 내용은 매개 변수가 있는 행 필터의 "파티션 옵션 설정" 섹션을 참조하세요.
게시에서 조인 필터를 사용하는 경우 논리적 레코드 관계에 관련된 모든 조인 필터에 대해 join unique key 속성을 true 로 설정해야 합니다. 자세한 내용은 Join Filters를 참조하세요.
테이블 간 관계
논리적 레코드를 통해 관련된 테이블에는 기본 키-외래 키 관계가 있어야 합니다.
외래 키 제약 조건에 대해서는 NOT FOR REPLICATION 옵션을 설정할 수 없습니다.
자식 테이블에는 부모 테이블이 하나만 있을 수 있습니다.
예를 들어 데이터베이스 추적 클래스 및 학생은 다음과 유사한 디자인을 가질 수 있습니다.
ClassMembers의 행은 단일 기본 키 행과 연결되지 않으므로 논리적 레코드를 사용하여 이 관계의 세 테이블을 나타낼 수 없습니다. ClassMembers 테이블과 Students 테이블 간에 논리적 레코드를 만들 수 있듯이 Classes 테이블과 ClassMembers테이블 간에도 논리적 레코드를 만들 수 있지만 이 3개의 테이블 간에는 논리적 레코드를 만들 수 없습니다.
게시에 순환 조인 필터 관계를 포함할 수 없습니다.
Customers, Orders 및 OrderItems 테이블과 함께 예제를 사용하면 Orders 테이블에 OrderItems 테이블을 참조하는 외래 키 제약 조건도 있는 경우 논리적 레코드를 사용할 수 없습니다.
논리적 레코드의 성능 영향
논리적 레코드 기능에는 성능 비용이 발생합니다. 논리적 레코드를 사용하지 않는 경우 복제 에이전트는 지정된 아티클에 대한 모든 변경 내용을 동시에 처리할 수 있으며, 변경 내용이 행 단위로 적용되므로 변경 내용을 적용하는 데 필요한 잠금 및 트랜잭션 로그 요구 사항은 최소화됩니다.
논리적 레코드를 사용하는 경우 병합 에이전트는 각 논리적 레코드에 대한 변경 내용을 함께 처리해야 합니다. 이는 행을 복제하는 데 병합 에이전트가 걸리는 시간에 영향을 줍니다. 또한 에이전트가 각 논리적 레코드에 대해 별도의 트랜잭션을 열기 때문에 잠금 요구 사항이 증가할 수 있습니다.