2010-11-20 27 views
1

Je voudrais désactiver, puis reconstruire un index unique dans une transaction de synchronisation. Peut-il être fait?Sync framework - comment activer et désactiver l'index unique dans une transaction de synchronisation?

J'ai plusieurs lignes dans une table qui doivent être modifiées mais les valeurs mises à jour violent un index unique. Cependant, une fois toutes les lignes modifiées, la contrainte sera satisfaite. Je souhaite donc désactiver cet index jusqu'à la fin du processus de synchronisation.

Répondre

1

Au cas où quelqu'un serait intéressé par une solution à un problème similaire - on peut prendre le contrôle de la transaction utilisée lors de la synchronisation en attachant à certains événements du fournisseur de synchronisation:

private void DbCacheServerSyncProvider_ApplyingChanges(object sender, ApplyingChangesEventArgs e) 
{ 
    if (e.Transaction == null) 
    { 
    e.Transaction = e.Connection.BeginTransaction(IsolationLevel.ReadCommitted); 

    DisableConstraints(e.Connection, e.Transaction); 
    } 
} 

private void DbCacheServerSyncProvider_ChangesApplied(object sender, ChangesAppliedEventArgs e) 
{ 
    if (e.Transaction != null) 
    { 
    EnableConstraints(e.Connection, e.Transaction); 

    e.Transaction.Commit(); 
    e.Transaction.Dispose(); 
    } 
} 

private void DbCacheServerSyncProvider_ApplyChangeFailed(object sender, ApplyChangeFailedEventArgs e) 
{ 
    if (e.Transaction != null) 
    { 
    e.Transaction.Rollback(); 
    e.Transaction.Dispose(); 
    } 

    throw new InternalException("Server-side conflict has occurred during synchronization. Conflict details:\r\n" + SyncUtils.CreateChangeFailedDetails(e).Trim('\r', '\n')); 
} 
0

Si vous ne modifiez pas l'index Unique, il n'est pas nécessaire de le faire.

Avec SQL Server 2008, vous pouvez effectuer une Réorganiser en ligne ou une recréation:

Qu'est-ce que vous essayez de faire?

+0

J'ai mis à jour la question . –