5/26/2009 2:04:18 PM

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

Есть несколько баз данных: дивелоперская, тестовая (та, на которой выполняются юнит и функциональны тесты), UAT (user acceptance test), на которой работают тестеры и немножко – маркетеры, pre-production (используется для проведения презентаций и т.д). В свете очень скорого релиза предполагается появление одной и более production базы данных.

Дивелоперская версия “эволюционирует” в режиме реального времени, в то время, как обновление UAT происходит автоматически по расписанию (это делает Team Build) и, понятное дело, нужно производить обновление базы данных в момент обновления продукта, то есть, в составе этого самого билда. Остальные базы – та же история, в момент обновления инсталяции.

Кроме того, понятное дело, каждая база данных хранит свои собственные данные. То есть, содержимое всех баз абсолютно разное и должно оставаться абсолютно разным. А вот структура данных должна быть одинаковая. Структура – это и схема БД, и состояние данных. То есть, если по каким-то причинам вдруг понадобилось увеличить цену продуктов на 20% (дурацкий пример), то сделать это нужно во всех базах, а продукты везде разные.

В общем, мы пробовали пользоваться различным софтом для сравнения и синхронизации схем БД, автоматизировать его, как-то проверять периодически на предмет, не напутал ли он чего (ведь может быть в девелоперской базе есть что-то, что и не нужно, чтобы было больше нигде), а уж DML эти (это я про “увеличить цену” как отслеживать…

В общем, мы пришли к очень простому, но действенному методу. Я, кстати, не верил, что будет так эффективно, когда начинали. Оказалось – очень неплохо.

Смысл метода заключается в том, что все изменения, которые делаются в БД, делаются посредством SQL-скриптов (а я предупреждал, что метод простой).
Скрипты, согласно конвенции, именуются в порядке очередности: 00129.sql, 00130.sql и т.д. Они хранятся в папке scripts одного из проектов в solution.
База данных содержит табличку SchemaVersion с одним числовым полем (TFS поступает так же, если я не ошибаюсь).
Проект, в котором это все лежит, называется DatabaseMigrator. Все, что он делает – читает из config-файла connection strings, подключается к базам, смотрит в SchemaVersion и исполняет скрипты, версия (имя) которых выше, чем то, что находится в БД. Выполнил – обновил версию.
Вот и все.
А дальше – для каждой конфигурации – просто свой app.config-файл. Team Build запускает DatabaseMigrator каждый раз, когда делает обновление UAT. Другие билды, которые обновляют другие инсталяции, делают то же самое.

Работать с этим всем совсем просто: каждый раз, когда мне нужно изменить схему, поменять структуру данных или что-то еще, я создаю sql-файлик и запускаю migrator. Прошло – отлично, дивелоперская и тестовая базы обновлены, можно работать. UAT и прочее – обновятся своевременно. При этом если я что-то напортачил в скрипте, то просто “упадет” билд – и ничего не сломается на существующей инсталяции.

Tags:

10/3/2006 3:02:00 AM

Иногда и такое может понадобиться. В моем случае - понадобилось пересобрать одну из библиотек dasBlog. И так как в интернете не оказалось никого из знакомых, которые работают с .NET 1.1, а компилировать из командной строки мне тоже не очень хотелось, пришлось искать другой метод.

И метод был найден. Имя ему - MSBee. Это не билайн от Майкрософт, это расширение для MS Build.

Установив его можно добавить в файл проекта инструкцию:

<Import Project="$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.CSharp.targets" />

Или, для пишущих на VB:

<Import Project="$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX11.VisualBasic.targets" />

сразу после имеющегося там импорта. В этом случае при компиляции проекта вы получите версию для FW 1.1 :)
С подсветкой синтаксиса от 2.0 ;)

Для тех, у кого ситуация более сложная, можно добавить условие, вроде:
 Condition=" '$(BuildingInsideVisualStudio)' == '' AND '$(TargetFX11)'=='true'"
И компилировать 1.1 или 2.0 в зависимости от условий.

Да, скачать MSBee можно на Codeplex, то есть тут.

Powered by BlogEngine.NET 1.6.0.0

About the author

Alexey Raga Alexey Raga
.NET software developer.

E-mail me Send mail

Twitter


Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

Sign in