Сложная миграция данных в прикладной среде уровня данных (DAC Fx)

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

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

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

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

Спасибо заранее за любые советы!

1 ответ

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

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

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

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

Другие вопросы по тегам