Синхронизация версий области Framework

В настоящее время мы используем Microsoft Sync Framework 2.1 для синхронизации данных между облачным решением и толстыми клиентами. Синхронизация инициируется клиентами и выполняется только для загрузки. Оба конца используют SQL Server, и я использую класс SqlSyncScopeProvisioning для предоставления областей. Мы не можем гарантировать, что клиенты будут работать с последней версией нашего программного обеспечения, но у нас есть полный контроль над облачной частью, и она всегда будет актуальной.

Мы рассматриваем возможность поддержки управления версиями областей, чтобы, если, например, я изменяю таблицу для добавления нового столбца, я мог сохранить любую исходную область (например, «ScopeA_V1»), добавляя при этом другую область, охватывающую все те же данные, что и первой области, но также и с новым столбцом (например, «ScopeA_V2»). Это позволит более ранним версиям клиента продолжать синхронизацию до тех пор, пока они не будут обновлены.

Чтобы добиться этого, я разрабатываю изменения модели данных особым образом, чтобы я мог только добавлять столбцы и таблицы, но никогда не удалял их, и все новые столбцы должны иметь значение NULL. Теоретически я думаю, что это должно позволить более старым версиям моих осциллографов продолжать функционировать, даже если они не синхронизируют новые данные.

Я думаю, что почти у цели, но я наткнулся на камень преткновения. Когда я предоставляю новые версии существующих областей, я получаю копии моей хранимой процедуры SelectChanges с правильной версией, но все хранимые процедуры, специфичные для таблиц (не относящиеся к областям, например tableA_update, tableA_delete и т. д.), не обновляются, как я думаю поставщик видит их как существующие и не думает, что они нуждаются в обновлении.

Есть ли способ заставить поставщика обновить соответствующие хранимые процедуры (_update, _insert и т. д.), чтобы он добавлял новые параметры для новых столбцов со значениями по умолчанию (null), позволяя использовать как новые, так и старые версии возможности их использования?

Кроме того, если я сделаю это, то, когда клиент будет обновлен до более новой версии, будет ли он повторно синхронизировать новые столбцы, даже если строки уже были синхронизированы (хотя и с нулями в новых столбцах)?

Или я иду об этом совершенно неправильно? Есть ли другой способ сделать прицелы обратно совместимыми со старыми версиями?


person Ross McCulloch    schedule 19.03.2012    source источник


Ответы (1)


Стандартная версия Sync Framework не поддерживает обновление определений областей в соответствии с изменениями схемы. и создание новой области с помощью SetCreateProceduresForAdditionalScopeDefault создаст только новую область и новую хранимую процедуру _selectchanges, но будет повторно использовать все остальные хранимые процедуры, таблицы отслеживания, триггеры и UDT.

я написал серию сообщений в блоге о том, что нужно изменить, чтобы учесть изменения схемы здесь: http://jtabadero.wordpress.com/2011/03/21/modifying-sync-framework-scope-definition-часть-1-введение/

последующие сообщения показывают некоторые способы взлома сценариев подготовки.

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

person JuneT    schedule 19.03.2012
comment
Спасибо, JuneT — ваши записи в блоге и ответы на вопросы стали основой моей разработки синхронизации! Да, я видел ваш пост об изменении области, но я надеялся, что, когда дело дойдет до подготовки более новой версии той же области, класс SqlSyncScopeProvisioning предоставит мне то, что мне нужно. В итоге я сделал клонирование вручную, используя ваш блог в качестве руководства. - person Ross McCulloch; 20.03.2012
comment
Возможно, мне следует добавить одну проблему, с которой я столкнулся сейчас: после того, как я подготовил более позднюю версию области, я не смог понять, как правильно клонировать знания из предыдущей версии области. Когда я пытаюсь выполнить синхронизацию, кажется, что все снова синхронизируется, даже если я не вносил никаких изменений в данные. Вы когда-нибудь писали в блоге о работе со знаниями синхронизации? Еще раз спасибо за помощь - person Ross McCulloch; 20.03.2012