Развернуть разные начальные данные для разных профилей публикации с помощью Visual Studio ssdt?

Можно ли развернуть разные наборы исходных данных для разных профилей публикации с помощью проекта базы данных Visual Studio Sql Server Data tools?

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

Зачем нам это делать?

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



Ответы (2)


Есть несколько способов добиться этого, первый подход — проверить среду в сценарии после развертывания, например..

if @@servername = 'dev_server'
begin
   insert data here
end

Несколько более чистая версия состоит в том, чтобы иметь разные файлы сценариев для каждой среды и импортировать их с помощью сценария :r import sqlcmd, чтобы вы могли:

  • PostDeploy.sql
  • DevServer.sql
  • QAServer.sql

потом

if @@servername = 'dev_server'
begin
   :r DevServer.sql
end
if @@servername = 'qa_server'
begin
   :r QAServer.sql
end

Вам нужно будет убедиться, что пути к файлам .sql указаны правильно, и вы скопируете их с помощью dacpac.

Вам не нужно использовать @@servername, вы можете использовать переменные sqlcmd и передавать их для каждой среды, что опять же немного чище, чем жестко закодированные имена серверов.

Второй подход заключается в том, чтобы настроить dacpac, чтобы изменить сценарий post delpoy на сценарий, специфичный для вашей среды, это мой предпочтительный вариант, который лучше всего работает как часть сборки CI, мой процесс таков:

  1. Изменения при регистрации
  2. Сервер сборки создает dacpac
  3. Сборка берет dacpac, копирует в папки env dev, qa, prod и т. д.
  4. Сборка заменяет сценарий после развертывания в каждом сценарии, специфичном для env.

Я вызываю сценарии PostDeploy.dev.sql, PostDeploy.Qa.sql и т. д. и устанавливаю для действия "Сборка" значение "Нет" или они добавляются как "Скрипт, не в сборке".

Чтобы заменить сценарий после развертывания, вам просто нужно использовать API упаковки .net или для некоторых примеров взгляните на мою демонстрацию Dir2Dac, которая делает это и многое другое:

https://github.com/GoEddie/Dir2Dac

более конкретно:

https://github.com/GoEddie/Dir2Dac/blob/master/src/Dir2Dac/DacCreator.cs

var part = package.CreatePart(new Uri("/postdeploy.sql", UriKind.Relative), "text/plain");

     using (var reader = new StreamReader(_postDeployScript))
     {
                reader.BaseStream.CopyTo(part.GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite));
     }
person Ed Elliott    schedule 16.11.2015
comment
Спасибо за ваш подробный ответ. В настоящее время я думаю, что буду использовать метод с несколькими сценариями, который вы описали в разделе «Чуть более чистая версия — иметь разные файлы сценариев для каждой среды». возможно, мы рассмотрим метод DacPac по мере необходимости. - person Dib; 16.11.2015
comment
Мне нужно взглянуть на последний вариант, который ты используешь, Эд. Учитывая возможный размер некоторых из этих сценариев начального заполнения, это будет ОГРОМНЫЙ объем данных для включения в каждый сценарий. Мы рассматриваем возможность просто посмотреть на переменную сборки, если она является новой, и запустить новые вещи после публикации прямо сейчас (что может быть лучшим/более простым выбором на данный момент). - person Peter Schott; 17.11.2015

Я решил эту проблему, написав сценарий Powershell, который автоматически запускается при публикации с помощью команды Exec в файле проекта.

Он создает файл сценария, который включает в себя все сценарии, найденные в папке проекта (папка имеет такое же имя, как и целевая среда).

Затем этот сценарий включается в сценарий после развертывания.

person SAS    schedule 18.11.2015
comment
Хм... Тоже неплохое решение. - person Dib; 18.11.2015