메타데이터 저장소 버전 업그레이드
Metadata Storage Service에서는 소형 데이터베이스에 복제본 및 항목 메타데이터를 저장합니다. 메타데이터는 특정 테이블 스키마 및 이진 형식으로 저장됩니다. 이러한 스키마나 형식은 새 버전의 Sync Framework가 릴리스되면 변경될 수 있습니다. 또한 데이터베이스의 사용자 지정 공급자 필드는 개발자가 새 버전의 특정 공급자를 릴리스할 때 변경될 수 있습니다. Sync Framework에서는 Sync Framework 버전 변경과 공급자 버전 변경으로 인한 메타데이터 저장소 업그레이드를 지원합니다.
또한 Sync Framework에서는 메타데이터 저장소 자체를 업그레이드하지 않고도 다른 버전의 구성 요소에 있는 메타데이터 저장소에 액세스할 수 있도록 지원합니다. 자세한 내용은 버전이 다른 구성 요소의 메타데이터 액세스를 참조하십시오.
Sync Framework 버전 변경으로 인한 업그레이드
Sync Framework 2.0의 메타데이터 저장소 스키마와 파일 형식은 Sync Framework 1.0과 다릅니다. 메타데이터 저장소 파일은 1.0 형식으로 유지하거나 효율성을 높이기 위해 2.0 형식으로 업그레이드할 수 있습니다.
참고
메타데이터 저장소 파일 업그레이드는 실행 취소할 수 없습니다. 2.0 형식의 파일을 1.0 형식으로 다시 다운그레이드할 수 없습니다.
공급자가 업그레이드 알림을 받도록 등록하고 Metadata Storage Service에서 파일 형식을 업그레이드할 수 없음을 나타내는 경우를 제외하고는 1.0 형식의 메타데이터 저장소 파일을 Sync Framework 2.0에서 열면 파일이 자동으로 2.0 형식으로 업그레이드됩니다. 업그레이드 발생 여부를 제어하려면 다음 단계를 따릅니다.
메타데이터 저장소 파일을 열기 전에 MetadataStoreUpgradeStart 이벤트를 받도록 등록하거나(관리 코드의 경우) IMetadataStoreUpgradeCallback 개체를 등록합니다(비관리 코드의 경우). IMetadataStoreUpgradeCallback을 등록하려면 ISyncMetadataStore2::SetMetadataStoreUpgradeNotificationCallback을 호출합니다.
OpenStore(관리 코드의 경우) 또는 ISqlSyncMetadataStore::OpenStore(비관리 코드의 경우)를 사용하여 메타데이터 저장소 파일을 엽니다.
Sync Framework에서 업그레이드가 필요함을 감지하고 MetadataStoreUpgradeStart 이벤트 처리기(관리 코드의 경우) 또는 IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart 메서드(비관리 코드의 경우)를 호출합니다.
공급자는 UpgradeStartEventArgs 개체의 SkipUpgrade 속성(관리 코드의 경우) 또는 IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart 메서드의 pfSkipUpgrade 매개 변수(비관리 코드의 경우)를 사용하여 메타데이터 저장소 파일을 업그레이드해야 하는지 여부를 나타냅니다.
공급자 버전 변경으로 인한 업그레이드
공급자는 ProviderVersion(관리 코드의 경우) 또는 IReplicaMetadata2::SetProviderVersion(비관리 코드의 경우)을 사용하여 복제본의 메타데이터와 호환되는 공급자 버전을 설정합니다. 공급자가 메타데이터 저장소를 열 때 ProviderVersion(관리 코드의 경우) 또는 IReplicaMetadata2::GetProviderVersion(비관리 코드의 경우)을 사용하여 복제본의 메타데이터와 연결된 공급자 버전을 확인할 수 있습니다. 메타데이터 저장소를 여는 공급자 버전과 메타데이터가 저장된 공급자 버전이 다르면 공급자가 복제본의 메타데이터 스키마를 업그레이드할 수 있습니다. 메타데이터 스키마를 업그레이드하려면 다음 단계를 따릅니다.
BeginTransaction(관리 코드의 경우) 또는 ISyncMetadataStore::BeginTransaction(비관리 코드의 경우)을 호출하여 트랜잭션을 시작합니다.
SyncMetadataStoreSerializer(관리 코드의 경우) 또는 ISyncMetadataStoreSerializer::SerializeReplicaMetadata(비관리 코드의 경우)를 사용하여 복제본의 메타데이터를 정식 형식으로 직렬화합니다.
RemoveReplicaMetadata(관리 코드의 경우) 또는 ISyncMetadataStore2::RemoveReplicaMetadata(비관리 코드의 경우)를 사용하여 메타데이터 저장소에서 복제본의 메타데이터를 제거합니다.
InitializeReplicaMetadata(관리 코드의 경우) 또는 ISyncMetadataStore::InitializeReplicaMetadata(비관리 코드의 경우)를 사용하여 메타데이터 저장소에 있는 복제본의 새 메타데이터를 초기화합니다. 이 호출에서는 업그레이드된 메타데이터 스키마의 사용자 지정 열 및 인덱스를 지정합니다.
DeserializeReplicaMetadata(관리 코드의 경우) 또는 ISyncMetadataStoreSerializer::DeserializeReplicaMetadata(비관리 코드의 경우)를 사용하여 1단계에서 직렬화한 메타데이터를 가져옵니다. 이 호출에서 업그레이드된 공급자 버전을 지정하고 업그레이드 중에 발생하는 이벤트 알림을 받을 IProviderUpgradeCallback(관리 코드의 경우) 또는 IProviderMetadataUpgradeCallback 개체(비관리 코드의 경우)를 제공합니다.
업그레이드하는 동안 OnCustomReplicaMetadataDeserialized(관리 코드의 경우) 또는 IProviderMetadataUpgradeCallback::OnReplicaCustomFieldDeserialized(비관리 코드의 경우)가 호출되어 공급자가 복제본의 사용자 지정 메타데이터 필드를 변경할 수 있도록 허용합니다.
업그레이드하는 동안 역직렬화되는 각 항목에 대해 OnItemMetadataDeserialized(관리 코드의 경우) 또는 IProviderMetadataUpgradeCallback::OnItemMetadataDeserialized(비관리 코드의 경우)가 한 번씩 호출되어 공급자가 항목에 대한 메타데이터를 변경할 수 있도록 허용합니다.
ProviderVersion(관리 코드의 경우) 또는 IReplicaMetadata2::SetProviderVersion(비관리 코드의 경우)을 사용하여 복제본의 메타데이터에서 업그레이드된 공급자 버전을 설정합니다.
CommitTransaction(관리 코드의 경우) 또는 ISyncMetadataStore::CommitTransaction(비관리 코드의 경우)을 호출하여 트랜잭션을 커밋합니다.
메타데이터 호환성 고려 사항
새 버전의 공급자를 릴리스할 때 메타데이터 호환성과 관련된 다음 고려 사항을 알고 있어야 합니다.
SyncIdFormatGroup(관리 코드의 경우) 또는 ID_PARAMETERS 구조(비관리 코드의 경우)에 지정된 복제본 ID, 항목 ID 등의 형식은 특정 동기화 커뮤니티 안의 모든 공급자 인스턴스 및 버전에서 동일해야 합니다. 이 규칙은 일반적이지만 확인을 위해 여기에서 다시 언급합니다.
복제본의 사용자 지정 필드는 호환되지 않는 방식으로 변경할 수 없습니다. 이 필드는 Sync Framework의 개입 없이 직렬화 및 역직렬화되는 BLOB입니다. 이전 공급자 버전에서 필드에 대해 읽거나 쓰지 못하는 방식으로 필드의 구조를 변경하지 마십시오.
공급자의 사용자 지정 열 및 인덱스 스키마는 공급자 버전 간에 변경될 수 있습니다. 이러한 스키마는 InitializeReplicaMetadata 메서드(관리 코드의 경우) 또는 ISyncMetadataStore::InitializeReplicaMetadata 메서드(비관리 코드의 경우)에서 선택적으로 지정됩니다. 그러나 다음 사항에 유의해야 합니다.
공급자는 메타데이터 스키마에 호환되지 않는 방식으로 변경할 수 없습니다. 예를 들어 이전 공급자가 모든 항목 업데이트에 대해 업데이트해야 하는 사용자 지정 필드를 제거할 수 없습니다.
새 버전의 공급자는 해당 열 업데이트가 선택 사항인 경우에만 사용자 지정 열을 추가할 수 있습니다. 이전 버전의 공급자는 이러한 열이 있는지 인식하지 못합니다.
사용자 지정 열 이름 및 값은 직렬화되지만 이러한 열에 대한 데이터 형식, 인덱스 및 다른 스키마 정보는 직렬화되지 않습니다. 즉, 정식 파일에서 메타데이터를 가져오기 전에 메타데이터 저장소에 사용자 지정 열 및 인덱스가 있어야 합니다.
사용자 지정 데이터 형식은 최신 버전의 공급자에서 변경될 수 없습니다. 이렇게 하면 이전 버전의 공급자에 대한 역직렬화 오류가 발생합니다.