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

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

Я читал статью " 12 шагов к лучшему коду", а в тесте Joel Test # 2: вы можете сделать сборку в одном шаг?

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

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

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

Есть ли более простой способ сделать это? Некоторый script или приложение там, где требуется "до и после", посмотрите на схему базы данных и создайте обновление script, как я уже упоминал?

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

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

7 ответов

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

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

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

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

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


redgate имеет инструмент SQL Compare для сравнения баз данных и создания script для синхронизации. Мы использовали его, но в последнее время переключились на ручные скрипты, используя тот же процесс, который вы описываете. Использование ручных, мелкозернистых, сценариев с уникальным номером версии получилось хорошо.

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


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

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

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

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

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

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


Ответ на первый вопрос: "Теперь мне было интересно, означает ли это развертывание (чтобы клиент мог обновить свое развертывание)?

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

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


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

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

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


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

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


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

licensed under cc by-sa 3.0 with attribution.