적용 대상: SQL Server 2008 이상
비고
이 기능은 이후 버전의 Microsoft SQL Server에서 제거됩니다. 새 개발 작업에서 이 기능을 사용하지 말고 현재 이 기능을 사용하는 애플리케이션을 수정할 계획입니다.
SQL Server 2014에서 트랜잭션 복제는 업데이트 가능한 구독 및 피어 투 피어 복제를 통해 구독자에서 업데이트를 지원합니다. 다음은 업데이트 가능한 구독의 두 가지 유형입니다.
즉시 업데이트합니다. 구독자에서 데이터를 업데이트하려면 게시자와 구독자를 연결해야 합니다.
대기열 업데이트를 통해 게시자와 구독자가 반드시 연결될 필요 없이 구독자 측에서 데이터를 업데이트할 수 있습니다. 구독자 또는 게시자가 오프라인 상태일 때 업데이트를 수행할 수 있습니다.
구독자에서 데이터가 업데이트되면 먼저 게시자에 전파된 다음 다른 구독자에게 전파됩니다. 즉시 업데이트를 사용하는 경우 변경 내용은 2단계 커밋 프로토콜을 사용하여 즉시 전파됩니다. 큐에 대기 중인 업데이트가 사용되는 경우 변경 내용은 큐에 저장됩니다. 그러면 네트워크 연결을 사용할 수 있을 때마다 큐에 대기 중인 트랜잭션이 게시자에서 비동기적으로 적용됩니다. 업데이트가 게시자에 비동기적으로 전파되기 때문에 동일한 데이터가 게시자 또는 다른 구독자에 의해 업데이트되었을 수 있으며 업데이트를 적용할 때 충돌이 발생할 수 있습니다. 게시를 만들 때 설정된 충돌 해결 정책에 따라 충돌이 감지되고 해결됩니다.
새 게시 마법사에서 업데이트할 수 있는 구독을 사용하여 트랜잭션 게시를 만드는 경우 즉시 업데이트 및 대기 중인 업데이트가 모두 사용하도록 설정됩니다. 저장 프로시저를 사용하여 게시를 만드는 경우 하나 또는 두 가지 옵션을 모두 사용하도록 설정할 수 있습니다. 게시에 대한 구독을 만들 때 사용할 업데이트 모드를 지정합니다. 그런 다음 필요한 경우 업데이트 모드 간에 전환할 수 있습니다. 자세한 내용은 다음 섹션 "업데이트 모드 간 전환"을 참조하세요.
트랜잭션 게시에 대한 업데이트 가능한 구독을 사용하도록 설정하려면 업데이트 구독 사용 설정을 하십시오.
트랜잭션 게시에 대해 업데이트할 수 있는 구독을 만들려면 트랜잭션 게시에 업데이트할 수 있는 구독 만들기를 참조하세요.
업데이트 모드 간 전환
업데이트할 수 있는 구독을 사용하는 경우 구독에서 하나의 업데이트 모드를 사용하도록 지정한 다음 애플리케이션에 필요한 경우 다른 업데이트 모드로 전환할 수 있습니다. 예를 들어 구독에서 즉시 업데이트를 사용하도록 지정할 수 있지만 시스템 오류로 인해 네트워크 연결이 끊어지면 대기 중인 업데이트로 전환할 수 있습니다.
비고
복제는 업데이트 모드 간에 자동으로 전환되지 않습니다. SQL Server Management Studio를 통해 업데이트 모드를 설정해야 합니다. 그렇지 않으면 애플리케이션 에서 sp_setreplfailovermode(Transact-SQL) 를 호출하여 모드 간에 전환해야 합니다.
즉시 업데이트에서 대기 중인 업데이트로 전환하는 경우 구독자와 게시자가 연결되고 큐 판독기 에이전트가 큐의 보류 중인 모든 메시지를 게시자에 적용할 때까지 즉시 업데이트로 다시 전환할 수 없습니다.
업데이트 모드 간에 전환하려면
업데이트 모드 간에 전환하려면 두 업데이트 모드에 대해 게시와 구독을 사용하도록 설정한 다음 필요한 경우 모드 간에 전환해야 합니다. 자세한 내용은 참조하세요.
업데이트할 수 있는 트랜잭션 구독에 대한 업데이트 모드 간에 전환합니다.
업데이트할 수 있는 구독 사용에 대한 고려 사항
구독 업데이트 또는 지연 업데이트 구독에 게시를 사용하도록 설정한 후에는 게시에 대해 옵션을 사용하지 않도록 설정할 수 없습니다(구독에서 사용할 필요는 없음). 이 옵션을 사용하지 않도록 설정하려면 게시를 삭제하고 새로 만들어야 합니다.
데이터 다시 게시는 지원되지 않습니다.
복제는 추적을 위해 게시된 테이블에 msrepl_tran_version 열을 추가합니다. 이 추가 열로 인해 모든
INSERT문에는 열 목록이 포함되어야 합니다.구독 업데이트를 지원하는 게시의 테이블에서 스키마를 변경하려면 테이블의 모든 활동을 게시자 및 구독자에서 중지해야 하며, 스키마를 변경하기 전에 보류 중인 데이터 변경 내용을 모든 노드로 전파해야 합니다. 이렇게 하면 미해결 트랜잭션이 보류 중인 스키마 변경과 충돌하지 않습니다. 스키마 변경 내용이 모든 노드로 전파되면 게시된 테이블에서 작업을 다시 시작할 수 있습니다. 자세한 내용은 복제 토폴로지 정지(복제 Transact-SQL 프로그래밍)를 참조하세요.
업데이트 모드 간에 전환하려는 경우 구독이 초기화된 후 큐 판독기 에이전트를 한 번 이상 실행해야 합니다(기본적으로 큐 판독기 에이전트는 지속적으로 실행됨).
구독자 데이터베이스가 가로로 분할되고 파티션에 게시자가 아닌 구독자에 있는 행이 있는 경우 구독자는 기존 행을 업데이트할 수 없습니다. 이러한 행을 업데이트하려고 시도하면 오류가 반환됩니다. 행을 테이블에서 삭제한 다음 게시자에 추가해야 합니다.
구독자 업데이트
구독이 만료되었거나 비활성 상태인 경우에도 구독자의 업데이트가 게시자에 전파됩니다. 이러한 구독이 삭제되거나 다시 초기화되었는지 확인합니다.
TIMESTAMP또는IDENTITY열이 사용되고, 해당 열이 기본 데이터 형식으로 복제되는 경우, 이러한 열의 값은 구독자에서 업데이트되어서는 안 됩니다.구독자는 복제 변경 내용 추적 트리거 내의 삽입되거나 삭제된 테이블에서 읽을 수 없으므로 값을 업데이트하거나 삽입
textntextimage할 수 없습니다. 마찬가지로, 구독자는 데이터를text또는image로 업데이트하거나WRITETEXT또는UPDATETEXT에 삽입할 수 없습니다. 이는 게시자가 데이터를 덮어쓰기 때문입니다. 대신text열과image열을 별도의 테이블로 분할하고 트랜잭션 내에서 두 테이블을 수정할 수 있습니다.구독자에서 대형 개체를 업데이트할 때에는 데이터 형식
varchar(max),nvarchar(max),varbinary(max)를 사용하고, 각각text,ntext,image데이터 형식을 대신 사용하세요.중복을 생성하는 고유 키(기본 키 포함)에 대한 업데이트(예: 양식
UPDATE <column> SET <column> =<column>+1업데이트는 허용되지 않으며 고유성 위반으로 인해 거부됨). 구독자에서 수행된 집합 업데이트는 복제에 의해 영향을 받는 각 행에 대한 개별UPDATE문으로 전파되기 때문입니다.구독자 데이터베이스가 가로로 분할되고 파티션에 게시자가 아닌 구독자에 있는 행이 있는 경우 구독자는 기존 행을 업데이트할 수 없습니다. 이러한 행을 업데이트하려고 시도하면 오류가 반환됩니다. 행을 테이블에서 삭제하고 다시 삽입해야 합니다.
사용자 정의 트리거
애플리케이션에 구독자에게 트리거가 필요한 경우 트리거는 게시자와 구독자에서
NOT FOR REPLICATION옵션을 사용하여 정의해야 합니다. 이렇게 하면 원래 데이터 변경에 대해서만 트리거가 발생하고 해당 변경 내용이 복제될 때는 트리거가 발생하지 않습니다.복제 트리거가 테이블을 업데이트할 때 사용자 정의 트리거가 실행되지 않는지 확인합니다. 이 작업은 사용자 정의 트리거의 본문에서 프로시저
sp_check_for_sync_trigger를 호출하여 수행됩니다. 자세한 내용은 sp_check_for_sync_trigger(Transact-SQL)를 참조하세요.
즉시 업데이트
즉시 업데이트 구독의 경우 구독자의 변경 내용이 게시자에 전파되고 MS DTC(Microsoft Distributed Transaction Coordinator)를 사용하여 적용됩니다. MS DTC가 게시자 및 구독자에 설치 및 구성되었는지 확인합니다. 자세한 내용은 Windows 설명서 를 참조하십시오.
구독을 즉시 업데이트하는 데 사용되는 트리거는 변경 내용을 복제하기 위해 게시자에 대한 연결이 필요합니다.
게시에서 구독을 즉시 업데이트할 수 있고 게시의 아티클에 열 필터가 있는 경우 기본값 없이 null을 허용하지 않는 열을 필터링할 수 없습니다.
대기 중 업데이트
병합 게시에 포함된 테이블은 지연 업데이트 구독을 허용하는 트랜잭션 게시의 일부로 게시할 수도 없습니다.
기본 키는 모든 쿼리에 대한 레코드 로케이터로 사용되므로 대기 중인 업데이트를 사용하는 경우 기본 키 열에 대한 업데이트는 권장되지 않습니다. 충돌 해결 정책이 구독자 우선으로 설정된 경우 기본 키에 대한 업데이트는 주의해야 합니다. 기본 키에 대한 업데이트가 게시자와 구독자 모두에서 이루어지면 결과는 서로 다른 기본 키를 가진 두 개의 행이 됩니다.
데이터 유형
SQL_VARIANT열에 대해 구독자에서 데이터가 삽입되거나 업데이트될 때, 이는 구독자에서 큐로 복사되는 과정에서 큐 판독기 에이전트에 의해 다음과 같이 매핑됩니다.BIGINT,DECIMAL,NUMERIC,MONEY및SMALLMONEY에NUMERIC로 매핑됩니다.BINARY및VARBINARY는VARBINARY데이터에 매핑됩니다.
충돌 감지 및 해결
구독자 우선 충돌 정책의 경우: 기본 키 열에 대한 업데이트에는 충돌 해결이 지원되지 않습니다.
외래 키 제약 조건 오류로 인한 충돌은 복제를 통해 해결되지 않습니다.
충돌이 예상되지 않고 데이터가 잘 분할된 경우(구독자는 동일한 행을 업데이트하지 않음) 게시자와 구독자에서 외래 키 제약 조건을 사용할 수 있습니다.
충돌이 예상되는 경우: "구독자 우선" 충돌 해결을 사용하는 경우 게시자 또는 구독자에서 외래 키 제약 조건을 사용하면 안 됩니다. "게시자 우선" 충돌 해결을 사용하는 경우 구독자에서 외래 키 제약 조건을 사용하면 안 됩니다.