2015-05-20 3 views
9

Моя компания использует проект базы данных Visual Studio для развертывания обновлений нашей БД. Насколько я могу судить, он обеспечивает функциональность для сравнения состояния схемы проекта и целевой БД и создания кода для обновления схемы последнего до первого. Он также предоставляет один сценарий предварительного развертывания и один пост-развертывающий скрипт, но не более того.Обновление версий в проектах базы данных Visual Studio

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

Насколько я могу судить, не существует способа обеспечить этот последовательный заказ сценариев до и после развертывания при развертывании с проектами базы данных Visual Studio. Я здесь? Это имеет 2 последствия: во-первых, вы просто не можете добавить столбец FK с ненулевым значением в таблицу после его создания, а во-вторых, что ваши сценарии до и после развертывания будут продолжать расти и расти и содержать cruft от лет назад, потому что они оба запускают каждый раз база данных развернута.

Есть ли способ обновления версий с проектами базы данных Visual Studio, а если нет, существует ли тип проекта, который позволил бы такого рода управление версиями?

+0

Вы посмотрели Ready-Roll? http://www.ready-roll.com/ Это инструмент от RedGate, который интегрируется с Visual Studio. Я думаю, что это то, что вам нужно. –

+0

Поскольку вы спросили о других типах проектов, взгляните на [Entity Framework 7 с миграциями] (https://channel9.msdn.com/Blogs/Seth-Juarez/Migrations-in-Entity-Framework-7- с-Брис-Lambson) –

ответ

3

Прежде всего, вы отметили это с помощью visual studio 2012 - если вы используете эту версию, обязательно обновите ее до 2013 или 2015 года и получите последнюю версию SSDT, поскольку выпуски выпускаются каждые 3 месяца с новыми функциями и исправлениями поэтому стоит завести новую версию - бит, о котором я говорю ниже, - это текущее поведение, я не знаю, было ли все это в оригинальной ssdt в visual studio 2012.

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

  1. Сложение dacpac 1
  2. Deploy dacpac 1
  3. Сложение dacpac 2
  4. Deploy dacpac 2
  5. Сложение dacpac 3

Было бы остановить вы не сможете развернуть dacpac 2 до того, как dacpac 1 был развернут, но не идеален, потому что если вы построили dacpac 3 перед развертыванием dacpac 2, то вы не сможете использовать его из-за восстановления dacpac 3, поэтому он не идеален.

Когда вы имеете дело с изменениями для базы данных (любые rdbms не только сервер sql), иногда случаются случаи, когда нам нужно выпустить изменения в фазах, и для меня это скорее проблема процесса, чем технологическая.Что я делаю:

  1. Создать первую часть изменения
  2. Создать билет в отставании завершить Изменение
  3. Развертывание изменений
  4. В будущей итерации после развертывания, подобрать билет, чтобы завершить изменение
  5. Развертывание финализации

Некоторые вещи, чтобы отметить об этом:

  • Это требует дисциплины, чтобы убедиться, что вы привести в порядок и полный материал, работающий в гибком образом не означает, что коряво :)
  • Любые сценарии вы пишете должны быть идемпотентна поэтому, если вы хотите настроить некоторые статические данные и т.д. использовать что-то вроде, если существует проверки или слияния заявление, если изменить любые объекты схемы завернуть их в случае существует и т.д. Если вы сделаете это, вы найдете развертывание гораздо более простой Почувствуйте

Если вы будете следовать этому а не полагаться на тип политики версий, тогда вам не нужно беспокоиться о том, какой заказ вы развертываете dacpacs, если сценарий имеет важное значение, оставьте его в сценарии пост-развертывания и проверьте, должен ли сценарий выполнять какую-либо работу перед его выполнением. Если ваши скрипты становятся слишком большими, вы можете использовать: r sqlcmd import, чтобы разделить их на разные файлы. Я также слышал о том, как люди используют хранимые процедуры развертывания и вызывают их из сценариев после развертывания.

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

Наконец, с вашим примером добавления столбца fk, не подлежащего обнулению, это можно сделать с помощью единственного развертывания dacpac. Для этого вы должны:

  1. Создать новое определение таблицы (в том числе ненулевого и ограничения внешнего ключа)
  2. В вашем после развертывания сценария сделать обновление на столе так, что он устанавливает данные правильно (очевидно, что делает его идемнотентные поэтому он может остаться в навсегда, если потребности быть)
  3. при развертывании включения/р: GenerateSmartDefaults

что происходит, когда сценарий развертывания генерируемый вы получаете сценарий, который выглядит как:

  • Pre-Deploy скрипт (если таковые имеются)
  • Создать столбец не пустой с временным ограничением по умолчанию
  • падение временное ограничение
  • Создание внешнего ключа с NOCHECK так это на самом деле не enfored
  • Run пост- развернуть сценарий
  • Включить ограничение внешнего ключа с помощью «с проверкой проверки»

/P: параметры, что я Мент ioned - args, вы переходите к sqlpackage.exe.если вы не используете это, но используете какой-либо другой способ для развертывания, вы можете передать их как параметры, если вы сообщите мне, как вы развертываете, если вы застряли, и я могу вам помочь. Описание аргументов приведено в файле https://msdn.microsoft.com/en-us/library/hh550080.aspx (sqlpackage.exe Синтаксис командной строки).

Сообщите мне, если у вас есть какие-либо вопросы, есть еще кое-что, о чем нужно подумать, но проверка в определении схемы и автоматическое создание сценариев развертывания сокращает работу, чтобы резко развернуть изменения и означает, что вы можете сосредоточиться на чем-то более полезном - написание единичных тестов для одного :).

Ed

Смежные вопросы