Инфраструктура синхронизации - как включить и отключить уникальный индекс внутри транзакции синхронизации? - PullRequest
1 голос
/ 20 ноября 2010

Я хотел бы отключить, а затем перестроить уникальный индекс внутри транзакции синхронизации.Можно ли это сделать?

У меня есть несколько строк в таблице, которые необходимо изменить, но обновляемые значения нарушают уникальный индекс.Однако после изменения всех строк ограничение будет выполнено, поэтому я хочу отключить этот индекс до конца процесса синхронизации.

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

В случае, если кого-то заинтересует решение аналогичной проблемы - можно взять под контроль транзакцию, используемую во время синхронизации, подключив некоторые события поставщика синхронизации:

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 голосов
/ 20 ноября 2010

Если вы не меняете индекс уникальности, делать это не нужно.

В SQL Server 2008 вы можете выполнить реорганизацию или перестроение в режиме онлайн:

Что вы пытаетесь сделать?

...