3

2 つの SQL Server 2005 データベース (サーバーとクライアント) を同期するために Microsoft Sync Framework を使用しようとしています。データベースには複数のテーブルがあり、それらの間に多くの外部キー関係があります。SyncOrchestrator を使用して 2 つのデータベースを同期しています。

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;

関数 ConfigureClientProvider および ConfigureServerProvider で、接続を初期化し、スコープが存在しないかどうかを確認してから作成します。

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;
}

同期を実行しようとすると、更新されたデータに対しては正常に機能しますが、データベースに挿入または削除があると外部キーの問題が発生します。例えば

INSERT ステートメントが FOREIGN KEY 制約 "FK_Employees_Departments" と競合しました。データベース「Sync_Client」、テーブル「dbo.Departments」、列「DepartmentID」で競合が発生しました。

テーブルの順序を変更すると、削除が原因で別のケースが発生するケースを解決できます。

DELETE ステートメントは、REFERENCE 制約 "FK_Employees_Departments" と競合しました。データベース「Sync_Client」、テーブル「dbo.Employees」、列「DepartmentID」で競合が発生しました。

これを修正する方法を知っている人はいますか。同期フレームワークは、変更を正しい順序で実行することをプロパティ化できないと思います。この順序は、外部キー関係、挿入、更新などのコマンドの種類などのいくつかの要因に依存します。私は本当にここで立ち往生しています。早期の助けをいただければ幸いです。

4

1 に答える 1

5

これは今では古い質問ですが、本当の答えがないため:

同期では、外部キーの子が挿入される前にすべての外部キーの親が配置されるように、各スコープのテーブルを挿入順にリストする必要があります。同期は、削除時にその順序を自動的に逆にします。

これはすべてうまくいきますが、何らかの理由で親テーブルまたは子テーブルのデータが独立した情報に基づいて異なるサーバーに格納されているデータベースがある場合、親と子は異なる同期規則を持つ可能性があります。利用可能な自動処理を超えています。

この場合、通常の同期フィルターが BASE テーブルの主キー情報に対して構築されている場合、代わりに TRACKING テーブルの主キー情報を使用するようにフィルターを強制する必要があります。これについては、social.msdn.microsoft.com にいくつかのコンテンツがあります。

于 2011-06-20T20:55:51.110 に答える