Каков простой способ развертывания изменений базы данных с помощью SQL Server?

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

Я читал статью "12 шагов к улучшению кода" и тест Джоэла №2. заявляет: Можете ли вы сделать сборку за один шаг?

Теперь мне было интересно, означает ли это сборку развертывания (чтобы клиент мог обновить свое развертывание).

Теперь главная проблема, с которой я сталкиваюсь, заключается в том, как выполнить одноэтапное обновление базы данных?

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

Есть ли более простой способ сделать это? Какой-то сценарий или приложение, которое просматривает схему базы данных «до и после» и создает сценарий обновления, как я уже упоминал?

Или это просто так, как все делают, во что мне трудно поверить, но правдоподобно.

Автоматизированная система уменьшит количество ошибок и значительно ускорит время сборки развертывания, и мне было бы интересно узнать, как это сделать.


person Brett Allen    schedule 22.12.2009    source источник


Ответы (7)


Существуют различные уровни сложности, которые вы можете пройти:

  • если у вас есть сценарии обновления, которые вы создаете вручную, и вы просто ищете способ легко применить их к различным серверам, ознакомьтесь с Развертывание SSW SQL от SSW Consulting. Он может очень хорошо справиться с этим сценарием

  • если вы склонны больше использовать подход сравнения баз данных, тогда Red Gate SQL Compare (уже упомянутый) и SQL Packager — отличная комбинация. Вы можете изменить базу данных между старой и новой, а затем применить изменения в красивом пакете - в виде EXE или проекта C#.

  • если вам нужен настоящий, комплексный, хорошо продуманный подход (с небольшой кривой обучения), проверьте Подход Innovartis DBGhost. Это целая методология/методика разработки баз данных и добавочных обновлений. Он очень мощный и выглядит очень многообещающе, но это своего рода подход «все или ничего»: либо вы покупаете его и используете от начала до конца, либо нет.

Надеюсь, что это помогает немного!

person marc_s    schedule 22.12.2009
comment
Я использую DbGhost уже 10 лет, и он всегда работал. Поддержка, которую они оказывают, не имеет себе равных. - person penderi; 21.02.2010
comment
@ysrb: ну, внутри Visual Studio есть инструменты данных SQL Server. 2012/2013, которые, кажется, автоматизируют многие из этих задач из коробки (если вы используете Visual Studio, то есть) - person marc_s; 05.10.2013
comment
@marc_s Спасибо, приятель. Будем разбираться :) - person ysrb; 06.10.2013

В Redgate есть инструмент Сравнение SQL для сравнения баз данных и создания сценария для синхронизировать. Раньше мы использовали его, но совсем недавно перешли на ручные сценарии, используя тот же процесс, который вы описываете. Использование ручных мелкозернистых сценариев с уникальным номером версии сработало хорошо.

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

person Samuel Neff    schedule 22.12.2009

Взгляните на этот пост в блоге. Я использовал этот тип одного сценария обновления из любой версии БД в нескольких проектах, и он работает очень хорошо.

http://blogs.msdn.com/danhardan/archive/2007/03/30/database-change-scripts-mambo-style.aspx

Возможно, вам придется немного изменить рабочий процесс, чтобы он соответствовал вашему рабочему процессу, и/или обновить файл шаблона .sql, но в целом я нашел эту идею довольно надежным подходом к развертыванию БД.

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, как я использовал эту технику. По сути, все мои сценарии ревизии БД помещаются в систему управления версиями. Затем, в качестве шага после сборки в окне сборки, этот инструмент Mambo запускается в каталоге сценариев, чтобы свернуть сценарии в один сценарий, охваченный транзакцией, чтобы обеспечить откат, если что-то пойдет не так. Затем установщик достаточно умен, чтобы найти сценарий .sql для запуска в существующей базе данных.

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

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

person Brian Hasden    schedule 22.12.2009

Ответ на первый вопрос: «Мне интересно, означает ли это сборку для развертывания (чтобы клиент мог обновить свое развертывание)?»

Я считаю, что тест Джоэла № 2 предназначен не для перехода от развертывания к продукту, а для непрерывной интеграции во время разработки.

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

person Michael Wheeler    schedule 22.12.2009
comment
(+1) хороший ответ. Чтобы реализовать это, вам нужны номера версий для состояния вашей базы данных, базового состояния и сценариев для внесения и отмены изменений в объектах базы данных. - person Hassan Syed; 22.12.2009
comment
Хотя они и не идеальны, миграции с рельсов делают это довольно хорошо. - person Jeff Paquette; 22.12.2009

Разработайте свою базу данных как набор патчей, которые зависят друг от друга. Затем используйте такой инструмент, как https://github.com/LuvDaSun/sqlpatch (мой), чтобы создать sql для развертывания.

sqlpatch сортирует исправления в правильном порядке и следит за тем, чтобы каждое исправление выполнялось ровно один раз, даже если один и тот же сценарий запускается дважды.

Эту стратегию можно использовать для развертывания вашей базы данных в среде ci/cd. Это делает развертывание таким же простым, как отправка в ветку.

person Elmer    schedule 25.04.2015

Сами Microsoft представили приложения уровня данных в SQL 2012 в качестве бесплатного варианта для развертывания и обновление баз данных.

Я использую и люблю этот инструмент, в том числе для производственных развертываний.

person ensslen    schedule 11.06.2015

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

person Gabriel McAdams    schedule 22.12.2009