Сборка VSTS — добавочное развертывание базы данных в распределенной среде

У меня есть база данных сервера sql, работающая с приложением .net 2015 mvc 5. Код моей базы данных управляется исходным кодом с использованием проекта SSDT. Я использую SqlPackage.exe для развертывания базы данных в промежуточной среде с использованием файла .Decpac, созданного в процессе сборки проекта SSDT. Это было сделано с помощью задачи powershell сборки VSTS. Таким образом, я могу вносить изменения в схему БД способом, контролируемым источником. Теперь проблема заключается в вставке основных данных для базы данных.

Я использую файл сценария sql, в котором есть сценарии вставки данных, которые выполняются как сценарий после развертывания. Этот файл также контролируется исходным кодом.

Проблема в том, что изначально мы подготовили сценарий вставки для спринта (взяв спринт n за основу), который хорошо работает для первого выпуска. но в следующем спринте, если обновить некоторые основные данные, то как следует обновить вставку основных данных:

  1. Добавить новый запрос на обновление/вставку в последний файл сценария? но в этом случае сценарий после развертывания будет выполняться CI, и он попытается вставить данные снова и снова в последующие сборки, которые в конечном итоге потерпят неудачу, если мы внесли некоторые изменения схемы в главные таблицы этой базы данных.
  2. Обновите существующие запросы на вставку в сценарии вставки данных. в этом случае у нас также есть проблемы, потому что в событии после сборки все данные будут повторно вставлены.
  3. Поддерживайте отдельные сценарии вставки данных для каждого сценария и обновляйте ссылку сценария на новый файл для события SSDT после сборки. Этот подход требует ручной работы и подвержен ошибкам, потому что разработчик должен помнить этот процесс. Также другая проблема с этим подходом заключается в том, что нам нужно настроить еще 1 сервер базы данных в ферме распределенных серверов. Сценарий вставки нескольких данных вызовет ошибки, потому что SSDT имеет последнюю схему, и он создаст базу данных с такой же. но в более старых сценариях данных есть вставка данных для предыдущей схемы (схема sprint wise db, которая была изменена в более поздних спринтах)

Так может ли кто-нибудь предложить лучший подход, который требует меньших ручных усилий, но может охватывать все вышеперечисленные случаи.

Спасибо, Рупендра.


comment
Мы сделали это с помощью нескольких скриптов, которые также проверяли, были ли значения уже в таблице. Вам, вероятно, потребуется изменить версию ваших скриптов, чтобы они работали с более новыми версиями вашей схемы, если есть существенные изменения. Либо так, либо вы версионируете свои dacpacs/проекты и выпускаете их постепенно.   -  person Peter Schott    schedule 14.06.2017
comment
Получили ли вы ответ, который поможет вам решить проблему? Если да, то можете пометить как ответ. И это поможет другим, у кого есть похожий вопрос.   -  person Marina Liu    schedule 28.06.2017
comment
Привет @Marina-MSFT Я еще не закончил это. Первоначально я считаю, что нужно использовать SSDT-файл Sprint и файл основных данных для каждого спринта в качестве сценария пост-сборки. И я буду запускать все SSDT поэтапно на случай, если потребуется полное развертывание. Но мне нужно его протестировать.   -  person Rupendra    schedule 28.06.2017
comment
Хороший вопрос :)   -  person Ronnie Kapoor    schedule 20.06.2018


Ответы (3)


Убедитесь, что ваши сценарии до и после развертывания всегда идемпотентны. Однако вы хотите реализовать это зависит от вас. Скрипты должны запускаться любое количество раз и всегда давать правильные результаты. Поэтому, если ваша схема изменится, что повлияет на сценарии развертывания, обновление сценариев зависит от изменений и сопровождает их в системе управления версиями. Управление версиями вашей базы данных уже является встроенной функцией SSDT. В самом файле проекта есть узел для версии. И в VSTS есть множество задач по сборке версий, которые вы также можете использовать бесплатно для создания версий. Когда SqlPackage.exe публикует ваш проект с уже установленной версией базы данных, запись обновляется в msdb.dbo.sysdac_instances. Это намного проще, чем пытаться управлять, обновлять и т. д. вашу собственную доморощенную версию решения. И вы не загромождаете базу данных своего приложения таблицами и другими объектами, не связанными с самим приложением. Я согласен с тем, чтобы информация о спринте не вмешивалась. В наших проектах я помечаю исходный код успешных сборок номером сборки, что, конечно же, создает временной маркер в исходном коде, связанный с конкретной сборкой.

person MikeZ    schedule 20.09.2018

Я бы предложил использовать операторы MERGE вместо вставки. Таким образом, вы защищены от повторяющихся вставок в рамках спринта.

Следующее, как различать разные вставки для разных спринтов. Я бы предложил реализовать нумерацию версий для синхронизации базы данных со спринтами. Итак, создайте таблицу DbVersion (версия int). Затем в сценарии после развертывания сделайте что-то вроде этого:

SET @version = SELECT ISNULL(MAX(version), 0) FROM DbVersion 
IF @version < 1
 --inserts/merge for sprint 1
IF @version < 2
 --inserts/merge for sprint 2
...
INSERT INTO DbVersion(@currentVersion)
person scar80    schedule 14.06.2017
comment
я пробую некоторые решения и инструменты. Однажды я бы попробовал ваше решение, и если бы оно работало хорошо. Я отмечу это или вернусь назад. Благодарность - person Rupendra; 20.06.2017
comment
Более подробную информацию можно найти здесь: enterprisecraftsmanship.com/ 18.08.2015/ - person scar80; 20.06.2017

Что я сделал в большинстве проектов, так это создал MERGE скриптов, по одному на таблицу, которые заполняют "основные" или "статические" данные. Существуют такие инструменты, как https://github.com/readyroll/generate-sql-merge, который можно использовать для создания этих скриптов.

Они вызываются из сценария после развертывания, а не в действии после сборки. Обычно я создаю один (в любом случае вам разрешен только один!) сценарий после развертывания для проекта, а затем включаю все отдельные сценарии статических данных, используя синтаксис :r. Сценарий после развертывания — это просто файл .sql с действием сборки «Пост-развертывание», его можно создать «вручную» или с помощью диалогового окна «Добавить новый объект» в SSDT и выбора «Сценарий» -> «Сценарий после развертывания».

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

Когда вы создаете dacpac, все основные данные будут включены, и, поскольку вы используете merge, а не вставку, вам гарантируется, что в конце развертывания содержимое таблиц будет соответствовать < em>содержимое вашей системы управления версиями, точно так же, как SSDT/sqlpackage гарантирует, что структура ваших таблиц соответствует структуре их определений в системе управления версиями.

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

person Gavin Campbell    schedule 15.06.2017
comment
я пробую некоторые решения и инструменты. Однажды я бы попробовал ваше решение, и если бы оно работало хорошо. Я отмечу это или вернусь назад. Благодарность - person Rupendra; 20.06.2017