Ищете решение для управления версиями баз данных

Описание проблемы:

В нашем проекте есть одна "производственная база данных" и множество "разработчиков". Мы хотим знать, как мы можем управлять и устанавливать изменения. У нас уже есть несколько процедур, но это занимает много времени и иногда вызывает ошибки.

Мы не можем потерять данные - поэтому мы не можем использовать "drop table". Мы можем использовать только "alter table".

Наша фактическая "процедура управления версиями db" выглядит следующим образом:

  • У нас есть таблица с именем [actual_version], которая содержит фактическую версию установленной схемы db
  • У нас есть файл с именем "changes_script.sql", который содержит все изменения базы данных - этот файл хранится в SVN

Когда разработчик хочет совершить новую ревизию в SVN, ему необходимо сменить_script.sql, добавив блок:

if ([acctual_version].version < "23")) {
    --- sql script ----
updateVersionTo("23")
end if 

Когда мы хотим обновить схему базы данных, мы просто "выполним" change_scripts.sql

Есть ли у кого-то лучшее представление?

Ответ 1

Red Gate Инструмент сравнения Sql может сравнивать две таблицы (или две коллекции DDL-скриптов или один набор сценарии к таблице и т.д.) и создать для вас миграцию script.

Если вы работаете в Ruby, вы можете посмотреть "Ruby Migrations", который является формализованным способом выполнения версий БД в коде. (В .NET есть похожие вещи, такие как RikMigrations и Fluent Migrator, и я уверен, что подобные вещи существуют и для других платформ).

Как сказал Рэнди Миндер, вы также можете использовать VS DB Edition для управления своей схемой, хотя я думаю, что инструменты RedGate работают так же легко и не привязывают вас к определенной платформе или IDE.

Ответ 2

Я делаю это очень похоже, но использует расширенные свойства базы данных вместо таблицы для отслеживания версии метаданных, а этапы обновления определены в приложении, а не один script. Большинство шагов обновления - это всего лишь execute script Upgrade.vX.Y.sql.

Я действительно нахожу ваш подход выше инструментов сравнения схем (и включает развертывание VS DB) по нескольким причинам:

  • Я не доверяю инструментам сравнения схем, изменяющим очень большие таблицы, я скорее имею протестированный script, специально предназначенный для моей таблицы 150B записей.
  • Сравнение схем не обрабатывает удаление устаревших объектов
  • Если схема приложения была изменена на клиентском сайте, инструмент сравнения будет слепо пытаться ее обновить, но модифицированной схеме может потребоваться специальная обработка: проверка изменений, оценка воздействия, выставление счетов за дополнительную работу.

Ответ 3

Вы слышали о Visual Studio Database Edition? Если вы используете VS Team Suite или VS Developer Edition, вы получаете его бесплатно. Это инструмент управления схемой базы данных, который поддерживает вашу схему, позволяет рефакторинг, сборку, анализ кода и развертывание.

Мы используем его для управления нашими схемами и развертываниями БД. Отличный инструмент.

Ответ 4

Вы описываете процесс, который используется во многих магазинах dev, я уверен, в том числе и в моей компании.

Если вы хотите придерживаться этого, одним из инструментов, который помог нам, является SSW SQL Deploy, который позволяет вам захватить целую кучу скриптов (у нас есть папка "changes" для каждой версии, а файлы - это метка "001_something.sql" через "999_somethingelse.sql" ) и выполняют их в целом по базе данных. Вы также можете включить это в свои приложения .NET через API или запустить его из командной строки во время установки.

Самый высокий конец спектра - принять весь процесс управления изменениями базы данных, что-то вроде DB Ghost от Innovartis, что очень много больше, чем просто набор инструментов. Но это потребует, чтобы вы и ваши разработчики приняли этот стиль тщательно, живите и дышите им. Очень интересно, но до сих пор мне не удалось убедить своих девов и боссов:-( Может быть, вам повезло больше?

Ответ 6

Вы посмотрели на Liquibase? http://www.liquibase.org/ Он управляет версиями для вас с поддержкой отката и rollforward