2010-01-21 4 views
2

2 개의 SQL Server 2005 데이터베이스 (서버 및 클라이언트)를 동기화하는 데 Microsoft Sync Framework를 사용하려고합니다. 데이터베이스에는 데이터베이스간에 여러 개의 외래 키 관계가있는 테이블이 여러 개 있습니다. SyncOrchestrator를 사용하여 두 데이터베이스를 동기화합니다. 함수 ConfigureClientProvider 및 ConfigureServerProvider에서 관계형 데이터베이스를 동기화하는 동안 Microsoft Sync 프레임 워크 문제가 발생했습니다.

string clientConnectionString = "<connection string>"; 
string serverConnectionString = "<connection string>"; 

SqlSyncProvider localProvider 
    = ConfigureClientProvider(clientConnectionString); 
SqlSyncProvider remoteProvider 
    = ConfigureServerProvider(serverConnectionString); 

SyncOrchestrator orchestrator = new SyncOrchestrator(); 
orchestrator.LocalProvider = localProvider; 
orchestrator.RemoteProvider = remoteProvider; 
orchestrator.Direction = SyncDirectionOrder.Download; 

내가 범위를하지 않는 경우는 종료는 다음을 만들 연결을 초기화하고 확인하고 있습니다 :

public static SqlSyncProvider ConfigureClientSyncProvider() 
{ 
    SqlSyncProvider provider = new SqlSyncProvider(); 

    provider.Connection = new SqlConnection(Configs.ConnectionString); 


    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("Test1"); 

    SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning(); 

    if (!serverConfig.ScopeExists("Test1", (System.Data.SqlClient.SqlConnection)provider.Connection)) 
    { 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Employees", (SqlConnection)provider.Connection)); 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Profiles", (SqlConnection)provider.Connection)); 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Department", (SqlConnection)provider.Connection)); 


     serverConfig.PopulateFromScopeDescription(scopeDesc); 

     serverConfig.SetCreateTableDefault(DbSyncCreationOption.Skip); 

     serverConfig.Apply((System.Data.SqlClient.SqlConnection)provider.Connection); 
    } 

    return provider; 
} 

를 이제 동기화를 실행하려고하면 업데이트 된 데이터에 대한 고급의 작동하지만 데이터베이스에 삽입이나 삭제가있을 때 외래 키 문제가 발생했습니다. 예 :

외래 키 제약 "FK_Employees_Departments"와 충돌 INSERT 문. 데이터베이스 "Sync_Client"테이블 "dbo.Departments", 열 'DepartmentID'에서 충돌이 발생했습니다.

테이블 순서대로 변경하면 삭제로 인해 다른 사례가 하나가 발생할 수 있습니다.

참조 제약 "FK_Employees_Departments"와 충돌 DELETE 문. 데이터베이스 "Sync_Client", 테이블 "dbo.Employees", 열 'DepartmentID'에서 충돌이 발생했습니다.

이 문제를 어떻게 해결할 수 있는지 전혀 알지 못합니다. 내가 생각하기에 동기화 프레임 워크는 올바른 순서로 변경 사항을 실행하는 것을 속성으로 처리 할 수 ​​없다고 생각합니다. 이 순서는 외래 키 관계, 명령의 유형과 같은 여러 요소에 따라 달라집니다. 삽입, 업데이트 등. 나는 정말로 여기에서 붙어있다. 조기 도움을 주시면 감사하겠습니다.

+0

나는 당신이 FK와 똑같은 문제를 겪고있는 것처럼 정확하게 일하고 있습니다. 귀하의 회신을 기다리겠습니다. – Belliez

+0

@Belliez,이 문제를 해결할 수있는 유일한 방법은 계단식 삭제를 사용하는 것입니다. 다음은 mdsn 포럼에 게시 한 또 다른 스레드입니다. http://social.microsoft.com/Forums/en-US/syncdevdiscussions/thread/0e8464a4-41a5-4897-b3d2-f14a0cf5d4b1 –

답변

4

이것은 오래된 질문은 지금,하지만 진짜 대답이 없기 때문에 : 모든 외부 키 아이들이 전에 모든 외부 키 부모님이 제자리에 있도록

동기화, 삽입 순서대로 각 범위에 테이블을 나열하도록 요구 삽입. 동기화하면 삭제시 해당 순서가 자동으로 바뀝니다.

이것은 모두 훌륭하고 멋지지만 어떤 이유로 든 부모 및 자식 테이블의 데이터가 독립적 인 정보를 기반으로 다른 서버에 저장되어 부모와 자녀가 가질 수있는 데이터베이스가있는 경우 다른 동기화 규칙을 사용하면 사용할 수있는 자동 처리가 너무 많아졌습니다.

이 경우 일반 동기화 필터가 BASE 테이블의 기본 키 정보에 대해 작성되는 경우 필터가 강제로 TRACKING 테이블의 기본 키 정보를 사용해야합니다. 이제 social.msdn.microsoft.com에서 이에 대한 일부 내용이 있습니다.

+0

+1 "Sync 필요를 나열해야합니다. 삽입 순서의 각 범위에있는 테이블 ".MS 포럼에서도 귀하의 게시물을 보았습니다. 너무 나쁘다. 지금까지 대답이 없다. – Jake

관련 문제