다음을 통해 공유


변경 내용 추적을 사용하는 응용 프로그램 빌드(SQL Server Compact)

SQL Server Compact 3.5 서비스 팩 2(SP2)부터 SQL Server Compact는 변경 추적 인프라에 대한 인터페이스를 제공합니다. SQL Server Compact 데이터베이스의 테이블에서 추적을 설정하면 SQL Server Compact에서 테이블에 대한 변경 내용(삽입, 업데이트 및 삭제)을 추적합니다. 이를 변경 내용 추적이라고도 합니다. 변경 내용 추적에서 제공하는 데이터를 사용하여 다양한 강력한 기능의 응용 프로그램을 빌드할 수 있습니다. 예를 들어 변경 내용 추적 데이터를 사용하면 장치나 컴퓨터에서 서버나 네트워크의 다른 피어에 연결하여 데이터를 동기화해야 하는 OCS(Occasionally Connected Systems)용 Sync Services를 제공하는 응용 프로그램을 빌드할 수 있습니다.

대략적으로 설명하면 SQL Server Compact에서는 다음 작업을 통해 변경 내용 추적을 구현합니다.

  • 추적이 설정된 사용자 테이블에 3개의 시스템 열 추가

  • 추적 관련 메타데이터를 저장하기 위한 3개의 시스템 테이블 만들기

  • 추적되는 사용자 테이블에 추가된 시스템 열에 추적 메타데이터 저장

  • 시스템 테이블에 추적 메타데이터 저장

  • System.Data.SqlServerCe 네임스페이스의 기존 클래스에 추가된 클래스 및 새 클래스를 통해 개발자에게 추적 인프라 제어 기능 제공

참고

"__sys"로 시작하는 테이블은 모두 시스템 테이블입니다. 이러한 테이블은 SQL Server Compact 런타임에서 만들고 유지 관리합니다. 응용 프로그램에서 시스템 테이블의 데이터를 직접 변경하거나 삭제할 수는 없습니다. SqlCeChangeTracking 클래스의 일부 메서드에서는 제한적으로 시스템 테이블을 사용하는 기능을 제공합니다. 이러한 메서드에 대해서는 다음 섹션에서 필요한 경우 설명합니다.

이 항목의 나머지 섹션에서는 변경 내용 추적을 사용하도록 빌드된 응용 프로그램을 개발하는 데 도움이 되는 정보를 제공합니다.

트랜잭션 시퀀스 번호

SQL Server Compact에서는 한 테이블이나 테이블 집합의 데이터를 삽입, 업데이트 또는 삭제하는 암시적 또는 명시적 트랜잭션이 시작되거나 커밋되는 시퀀스를 식별하는 데 두 개의 번호를 사용합니다.

  • BSN(시작 시퀀스 번호)은 데이터베이스에서 트랜잭션이 시작되는 시퀀스를 고유하게 식별하는 단순 증가하는 카운터로서, 트랜잭션이 시작될 때 SQL Server Compact에 의해 할당되며 다음 트랜잭션이 시작될 때 증가합니다.

  • CSN(커밋 시퀀스 번호)은 데이터베이스에서 트랜잭션이 커밋되는 시퀀스를 고유하게 식별하는 단순 증가하는 카운터로서, 트랜잭션이 커밋될 때 데이터베이스에 의해 할당되며 다음 트랜잭션이 커밋될 때 증가합니다.

BSN과 CSN은 특정 트랜잭션이 SQL Server Compact 데이터베이스에서 작동하는 다른 트랜잭션에 상대적으로 시작되고 커밋되는 시퀀스를 고유하게 식별합니다.

추적되는 테이블에 추가된 행(행 내부 메타데이터)

사용자 테이블에서 추적을 설정하면 테이블에 3개의 열이 추가됩니다. 이러한 열 중 두 열에는 각 행에 적용되는 변경 내용에 대한 메타데이터가 저장되고, 세 번째 열은 응용 프로그램별 컨텍스트 정보를 저장하는 데 선택적으로 사용할 수 있습니다. 추적을 해제하면 이러한 열은 삭제됩니다.

다음 표에서는 이러한 행 내 메타데이터를 보관하기 위해 추가되는 열에 대해 설명합니다.

열 이름

데이터 형식

설명

__sysChangeTxBsn

binary(8)

행을 업데이트하는 마지막 트랜잭션의 BSN입니다.

__sysInsertTxBsn

binary(8)

행을 삽입한 트랜잭션의 BSN입니다.

__sysTrackingContext

uniqueidentifier

응용 프로그램별 컨텍스트 정보입니다. 이 열은 행을 수정하는 마지막 트랜잭션(SqlCeTransaction)의 TrackingContext 속성에 따라 설정됩니다. 개발자는 이 속성을 사용하여 응용 프로그램과 관련된 정보를 보관할 수 있습니다. 예를 들어 데이터를 변경하는 사용자 또는 시스템을 식별하는 정보를 보관할 수 있습니다.

테이블에서 행을 삭제하는 작업뿐 아니라 삭제 작업을 수행하면 삭제된 행에 대한 정보가 포함된 행이 삭제 표시 테이블에 추가됩니다.

시스템 테이블

다음 시스템 테이블은 변경 내용 추적에 사용됩니다.

삭제 표시 테이블

추적이 설정된 테이블에서 행을 삭제하면 삭제 표시 테이블에 해당 행에 대한 레코드(__sysOCSDeletedRows)가 만들어집니다. 데이터베이스에는 하나의 삭제 표시 테이블이 있으며 이 테이블에는 데이터베이스의 추적되는 테이블에서 삭제된 행에 대한 정보가 포함되어 있습니다. 다음 표에서는 삭제 표시 테이블의 열에 대해 설명합니다.

열 이름

데이터 형식

설명

__sysTN

nvarchar(128)

행이 삭제된 사용자 테이블의 이름입니다.

__sysDeleteTxBsn

binary(8)

행을 삭제한 트랜잭션의 BSN입니다.

__sysInsertTxBsn

binary(8)

사용자 테이블에 행을 삽입한 트랜잭션의 BSN입니다.

__sysRK

varbinary(8000)

행 키입니다. 이 행 키는 ROWGUIDCOL 특성이 적용된 사용자 테이블에 있는 uniqueidentifier 데이터 형식의 열(ROWGUID 열)이나 사용자 테이블의 기본 키일 수 있습니다. 행 키를 사용하면 추적 시스템에서 사용자 테이블 행을 고유하게 식별할 수 있으며 행 키는 삭제 표시 테이블에 직렬화된 형식으로 저장됩니다.

__sysDeletedTime

datetime

사용자 테이블에서 행이 삭제된 시간입니다.

행 키는 사용자 테이블의 단일 열(단일 열 기본 키인 경우)이나 ROWGUID 열로 구성되거나, 기본 키가 여러 열로 구성된 경우 각각 다른 데이터 형식의 여러 열을 포함할 수 있습니다. 따라서 행 키는 삭제 표시 테이블에 직렬화된 형식으로 저장됩니다. PackTombstoneKeyUnpackTombstoneKey 메서드를 사용하여 직렬화된 이 형식 간에 상호 변환할 수 있습니다. TrackingKeyType 열거형 값 중 하나를 EnableTracking 메서드에 매개 변수로 전달하여 테이블에서 추적을 설정함으로써 추적 시스템에서 사용하는 사용자 테이블에 키 유형(기본 키 또는 ROWGUID 열)을 설정할 수 있습니다.

시간이 지나면서 삭제 표시 테이블이 상당히 커질 수 있습니다. PurgeTombstoneTableData 메서드를 사용하여 테이블에서 행을 삭제할 수 있습니다. 사용자 테이블에서 행이 삭제된 날짜부터 경과한 일 수(시간 기반 제거) 또는 행을 삭제한 트랜잭션의 CSN(CSN 기반 제거)에 따라 삭제 표시 테이블에서 행을 제거할 수 있습니다.

트랜잭션 커밋 시퀀스 테이블

트랜잭션은 트랜잭션이 시작된 순서와 다른 순서로 커밋될 수 있습니다(시퀀스를 벗어난 커밋). 커밋 시퀀스 테이블(__sysTxCommitSequence)은 이러한 시퀀스를 벗어난 트랜잭션을 추적합니다. 해당 트랜잭션이 시퀀스를 벗어난 커밋을 수행하는 경우 트랜잭션이 커밋될 때 이 테이블에 행이 삽입됩니다. 다음 표에서는 트랜잭션 커밋 시퀀스 테이블의 열에 대해 설명합니다.

열 이름

데이터 형식

설명

__sysTxBsn

binary(8)

트랜잭션의 BSN입니다.

__sysTxCsn

binary(8)

트랜잭션의 CSN입니다.

__sysCommitTime

datetime

트랜잭션이 커밋된 시간입니다.

참고

시퀀스를 벗어나 커밋된 트랜잭션에 대해서만 트랜잭션 커밋 시퀀스 테이블에 행이 추가됩니다.

다음 예에서는 트랜잭션 커밋 시퀀스 테이블에 트랜잭션이 삽입되는 방식을 보여 줍니다.

5개의 트랜잭션인 T1, T2, T3, T4, T5를 살펴 봅니다.

이러한 트랜잭션의 시작 순서와 커밋 순서는 다음과 같습니다.

트랜잭션 시작 시퀀스(시작 순서): T1, T2, T3, T4, T5

트랜잭션 커밋 시퀀스(커밋 순서): T1, T3, T4, T2, T5

이 트랜잭션 그룹의 CSN과 BSN 모두 1에서 시작한다고 가정합니다. 다음 표에서는 각 트랜잭션의 CSN과 BSN을 보여 주고 트랜잭션 커밋 시퀀스 테이블에 해당 트랜잭션에 대한 항목이 만들어지는지 여부를 설명합니다.

T1

T2

T3

T4

T5

BSN

1

2

3

4

5

CSN

1

4

2

3

5

행이 __sysTxCommitSequence에 삽입되었습니까?

아니요

아니요

시간이 지나면서 트랜잭션 커밋 시퀀스 테이블이 상당히 커질 수 있습니다. PurgeTransactionSequenceData 메서드를 사용하여 이 시스템 테이블에서 행을 삭제할 수 있습니다. 행이 추가된 날짜부터 경과한 일 수(시간 기반 제거) 또는 트랜잭션의 CSN(CSN 기반 제거)에 따라 테이블에서 행을 제거할 수 있습니다.

테이블에 변경 내용 열거

이 섹션의 쿼리는 테이블에 변경 내용을 열거하는 방법에 대한 예를 보여 줍니다. 변경 내용을 열거할 테이블의 이름이 각 쿼리에 매개 변수 {0}으로 전달됩니다.

다음 매개 변수도 정의됩니다.

  • EBSN: 열거형 시작 시퀀스 번호. 동기화가 변경 내용 열거를 시작하기 직전에 확정된 트랜잭션 BSN입니다. 이 값은 열거하는 동안 테이블에 대한 변경 내용을 가져오지 않도록 하는 데 사용됩니다. 

  • ECSN: 열거형 커밋 시퀀스 번호. 동기화가 변경 내용 열거를 시작하기 직전에 확정된 트랜잭션 CSN입니다. 이 값은 열거하는 동안 테이블에 대한 변경 내용을 가져오지 않도록 하는 데 사용됩니다. 

  • LBSN: 마지막 동기화 시작 시퀀스 번호. 성공적인 마지막 동기화의 EBSN입니다.

  • LCSN: 마지막 동기화 커밋 시퀀스 번호. 성공적인 마지막 동기화의 ECSN입니다.

참고

업로드를 다운로드와 독립적으로 커밋할 수 있습니다. 업로드가 완료되고 승인된 후에 LBSN은 EBSN으로 설정되고 LCSN은 ECSN으로 설정됩니다.

다음 쿼리는 삽입 내용을 열거합니다.

        private const string cmdEnumerateInserts =
            " select ut.* from " + 
            "   (select ut0.* from {0} as ut0 where " + 
            "     ut0.__sysInsertTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn >= @LBSN " + 
            "   ) as ut " + 
            " LEFT OUTER JOIN " + 
            "   (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " + 
            " ON (ut.__sysInsertTxBsn = txcs.__sysTxBsn) WHERE " +
            "      (txcs.__sysTxBsn IS NOT NULL and txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR  " + 
            "      (txcs.__sysTxBsn IS NULL AND ut.__sysInsertTxBsn >= @LCSN AND ut.__sysInsertTxBsn < @ECSN)";

다음 쿼리는 업데이트 내용을 열거합니다.

        private const string cmdEnumerateUpdates =
            " SELECT ut.* FROM " +  
            "   (select ut0.* from {0} as ut0 where " + 
            "     (ut0.__sysChangeTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn >= @LBSN) " + 
            "   ) as ut " + 
            " LEFT OUTER JOIN" + 
            "   (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " + 
            " ON ut.__sysChangeTxBsn = txcs.__sysTxBsn OR txcs.__sysTxBsn IS NULL WHERE " + 
            "   (txcs.__sysTxBsn IS NOT NULL AND txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR " + 
            "   (txcs.__sysTxBsn IS NULL AND ut.__sysChangeTxBsn >= @LCSN AND ut.__sysChangeTxBsn < @ECSN) ";

다음 쿼리는 삭제 내용을 열거합니다.

        private const string cmdEnumerateDeletes =
            " SELECT ut.__sysRK  FROM " +
            "   (select ut0.* from __sysOcsDeletedRows as ut0 where " +
            "     (ut0.__sysInsertTxCsn IS NULL OR ut0.__sysInsertTxCsn < @LCSN) and " + // Filter INSERT + DELETE 
            "     ut0.__sysTName = \'{0}\'" + 
            "   ) AS ut " +
            " LEFT OUTER JOIN  " +
            "   (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " + 
            " ON ut.__sysDeleteTxBsn = txcs.__sysTxBsn OR txcs.__sysTxBsn IS NULL WHERE " + 
            "   (txcs.__sysTxBsn IS NOT NULL AND txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR " + 
            "   (txcs.__sysTxBsn IS NULL AND ut.__sysDeleteTxBsn >= @LCSN AND ut.__sysDeleteTxBsn < @ECSN) ";

프로그래밍 방식으로 변경 내용 추적 제어

System.Data.SqlServerCe 네임스페이스의 기존 클래스에 추가된 새 메서드와 속성 및 새 클래스를 사용하여 SQL Server Compact 데이터베이스에 대한 변경 내용 추적을 구성하고 제어할 수 있습니다. 다음 표에서는 이러한 새 아티팩트에 대한 간략한 개요를 제공합니다.

아티팩트

정의

PurgeType 열거형

삭제 표시 테이블 또는 트랜잭션 커밋 시퀀스 테이블에서의 추적 데이터 제거가 시간 기반인지 CSN 기반인지를 지정하는 데 사용되는 값을 포함합니다.

SqlCeChangeTracking 클래스

변경 내용 추적에 사용되는 기본 클래스입니다. SQL Server Compact 데이터베이스의 테이블에서 변경 내용 추적을 사용하거나 사용하지 않도록 설정 및 구성하는 메서드를 제공합니다. 삭제 표시 테이블 및 트랜잭션 커밋 시퀀스 테이블에서 추적 데이터를 제거하거나 Microsoft Sync Framework 1.0 SP1 이상 버전의 Sync Framework에서 사용하도록 SQL Server Compact 3.5 SP2 데이터베이스를 업그레이드하는 데 사용할 메서드도 제공합니다.

SqlCeTransaction 클래스

두 가지 새로운 속성이 추가되었습니다. CurrentTransactionBsn 속성은 SQL Server Compact에서 트랜잭션에 할당한 BSN을 반환합니다. TrackingContext 속성은 응용 프로그램 관련 정보를 보관하도록 제공됩니다. 이 정보는 개발자가 정의할 수 있습니다. 추적이 설정된 사용자 테이블을 수정하면 수정된 행의 __sysTrackingContext 열은 TrackingContext 속성 값으로 설정됩니다.

TrackingKeyType 열거형

변경 내용 추적 인프라에서 사용자 테이블의 행을 고유하게 식별하는 데 사용할 키 유형을 지정하는 값을 포함합니다. 이 키는 ROWGUIDCOL 특성이 적용된 uniqueidentifier 형식의 열이나 테이블에 정의된 기본 키일 수 있습니다.

TrackingOptions 열거형

사용자 테이블에서 추적할 작업 유형을 지정하는 값을 포함합니다. 테이블에서는 삽입, 업데이트, 삭제 또는 이러한 작업의 조합을 추적할 수 있습니다.

참고 항목

참조

System.Data.SqlServerCe

SqlCeChangeTracking