Сложная миграция данных в прикладной среде уровня данных (DAC Fx) - PullRequest
5 голосов
/ 20 марта 2012

Я рад сделать скачок в использовании DAC Fx и разработке декларативной базы данных.Основным препятствием для меня является то, как обрабатывать сложные миграции данных в нескольких различных версиях схемы.В старом мире мы можем просто запускать все наши сценарии обновления по порядку, что гарантирует, что схема находится в правильном состоянии во время переноса данных.Как это работает, когда путь обновления является динамическим?

Например, предположим, что существует несколько версий моей схемы (DACPAC1-4) для существующих экземпляров:

  • DACPAC1: таблица A существуети имеет ценные данные клиента
  • DACPAC2: таблица A устарела и заменена на tableB и нормализованную tableC;добавляет новый скрипт tableD
    • после развертывания: переместить данные из таблицы A в новую таблицу B и таблицу C;drop tableA
  • DACPAC3: в tableC есть новый столбец, допускающий обнулениеX
    • сценарий после развертывания: заполняет обнуляемый столбец на основе таблицыD
  • DACPAC4: tableC.columnX не обнуляется

Если мне нужно иметь возможность поддерживать обновление серверов DACPAC1-3 до последней версии DACPAC4, теперь мне нужно написать свои до и после развертыванияСценарии достаточно умным способом, чтобы определить, какой DACPAC в данный момент находится на цели, и правильно обработать шаги миграции данных по порядку.Кроме того, я не могу просто повторно использовать наивные сценарии после развертывания, которые я написал изначально, поскольку они зависят от промежуточных версий схемы.

Заранее благодарен за любой совет!

1 Ответ

0 голосов
/ 31 августа 2012

Обычно я делаю следующее:

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

  2. Обычно я также включаю другое свойство, называемое MinAppVersion (минимальная версия, совместимая с текущей схемой).Когда приложение пытается подключиться к базе данных, оно сравнивает свою текущую версию сборки с MinAppVersion, хранящимся в базе данных.Если версия равна или выше, чем MinAppVersion, то соединение устанавливается, в противном случае выдается исключение.

Надеюсь, это поможет.С уважением,

...