В настоящее время мы используем Microsoft Sync Framework 2.1 для синхронизации данных между облачным решением и толстыми клиентами. Синхронизация инициируется клиентами и выполняется только для загрузки. Оба конца используют SQL Server, и я использую класс SqlSyncScopeProvisioning для предоставления областей. Мы не можем гарантировать, что клиенты будут работать с последней версией нашего программного обеспечения, но у нас есть полный контроль над облачной частью, и она всегда будет актуальной.
Мы рассматриваем возможность поддержки управления версиями областей, чтобы, если, например, я изменяю таблицу для добавления нового столбца, я мог сохранить любую исходную область (например, «ScopeA_V1»), добавляя при этом другую область, охватывающую все те же данные, что и первой области, но также и с новым столбцом (например, «ScopeA_V2»). Это позволит более ранним версиям клиента продолжать синхронизацию до тех пор, пока они не будут обновлены.
Чтобы добиться этого, я разрабатываю изменения модели данных особым образом, чтобы я мог только добавлять столбцы и таблицы, но никогда не удалял их, и все новые столбцы должны иметь значение NULL. Теоретически я думаю, что это должно позволить более старым версиям моих осциллографов продолжать функционировать, даже если они не синхронизируют новые данные.
Я думаю, что почти у цели, но я наткнулся на камень преткновения. Когда я предоставляю новые версии существующих областей, я получаю копии моей хранимой процедуры SelectChanges с правильной версией, но все хранимые процедуры, специфичные для таблиц (не относящиеся к областям, например tableA_update, tableA_delete и т. д.), не обновляются, как я думаю поставщик видит их как существующие и не думает, что они нуждаются в обновлении.
Есть ли способ заставить поставщика обновить соответствующие хранимые процедуры (_update, _insert и т. д.), чтобы он добавлял новые параметры для новых столбцов со значениями по умолчанию (null), позволяя использовать как новые, так и старые версии возможности их использования?
Кроме того, если я сделаю это, то, когда клиент будет обновлен до более новой версии, будет ли он повторно синхронизировать новые столбцы, даже если строки уже были синхронизированы (хотя и с нулями в новых столбцах)?
Или я иду об этом совершенно неправильно? Есть ли другой способ сделать прицелы обратно совместимыми со старыми версиями?