Как создать сценарии развертывания из проектов баз данных VS 2012?

С проектами баз данных VS2010 я мог определить целевую (или нет) базу данных, задать действие (создать только сценарий или создать сценарий и развернуть его на цели), выполнить «развертывание» (через VS или MSBuild) и получить результирующий сценарий.

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

Эта функция позволила мне создать как обновление (только изменения с момента последней версии), так и сценарий полной установки (если не указана целевая база данных).

Кажется, я не могу найти правильную комбинацию параметров для воспроизведения этого поведения «только сценарий» для обновлений и полной установки при использовании VS 2012 или SSDT в целом.

Я нашел этот вопрос, в котором рассматривается, как нажимать кнопки в VS, но не рассматривается, как это сделать в MSBuild.

Может ли кто-нибудь указать мне полезный ресурс для этой конкретной конфигурации?


person StingyJack    schedule 10.10.2012    source источник


Ответы (2)


После взлома в течение нескольких часов я смог получить что-то работоспособное. Это сводится к двум важным элементам: получению правильного публикуемого XML-файла и правильным аргументам для MSBuild.

Публикуемый xml-файл был стандартным форматом, созданным с помощью VS. Похоже что-то это...

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>BLANK</TargetDatabaseName>
    <DeployScriptFileName>DeployTarget.sql</DeployScriptFileName>
    <TargetConnectionString>Data Source=SERVER;Integrated Security=True;Pooling=False</TargetConnectionString>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <ScriptDatabaseOptions>False</ScriptDatabaseOptions>
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
    <CommentOutSetVarDeclarations>False</CommentOutSetVarDeclarations>
  </PropertyGroup>
</Project>

В предыдущем формате проекта можно было оставить целевую базу данных и строку подключения пустой, и это сгенерировало бы «полный» сценарий развертывания. Однако в файлах SSDT sqlproj вы должны указать что-то, даже если оно неверно, отсюда и имя базы данных «ПУСТОЙ». Если я изменю это на реальную базу данных, это создаст дельта-скрипт.

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /p:Configuration=Release;Platform=AnyCPU;SqlPublishProfilePath="<fullPathToPublishXML";UpdateDatabase=False /t:Rebuild,Publish "<fullPathToSqlProj>"

Это по-прежнему не учитывает DeployScriptFileName, которое находится в публикации xml (он создает файл sql с тем же именем, что и профиль публикации), но, похоже, создает правильное содержимое в файле.

person StingyJack    schedule 11.10.2012
comment
Любые предложения по улучшению приведенного выше ответа приветствуются. Я подумал, что должен хотя бы опубликовать этот ответ на случай, если кто-нибудь сможет его использовать. - person StingyJack; 11.10.2012
comment
Спасибо @StingyJack! Вы сэкономили мне часы разочарований в поисках способа сгенерировать ПОЛНЫЙ сценарий развертывания для установки Prod DB моего проекта. Я заметил, что если вы укажете TargetDatabaseName как BLANK, скрипт сгенерирует материал для создания БД с именем BLANK. Возможно, вы захотите упомянуть, что эту часть следует удалить или изменить после создания ПОЛНОГО сценария. Кроме того, я заметил, что у меня нет действительного сервера в Data Source=SERVER выше. Скрипт генерирует в папку \bin, но превью бомбы. Скрипт также является инкрементным. - person Shiva; 19.07.2016
comment
DeployScriptFileName не работает, но PublishScriptFileName работает. - person bielawski; 04.08.2016
comment
Примечание: это было для проектов 2010, а затем 2012, где VS сгенерировал DeployScriptFileName в xml. PublishScriptFileName был недоступен (я до сих пор не могу найти документы по нему в течение 3 минут). - person StingyJack; 26.09.2016
comment
Если вы хотите пропустить файл publish.xml и просто передать значения, используйте /t:Rebuild,Deploy, а не /t:Rebuild,Publish. Затем вы можете сделать что-то вроде msbuild /p:Configuration=Release /p:Platform=AnyCpu /p:TargetDatabaseName=... /p:TargetConnectionString="..." /p:DeployScriptFileName=generated.sql /p:UpdateDatabase=False /t:Rebuild,Deploy "...path to sqlproj". - person JohnnyFun; 17.02.2019
comment
Кроме того, если вы столкнулись со странными ошибками msbuild, но можете просто собрать sqlproj из Visual Studio, попробуйте указать на тот же msbuild, который использует Visual Studio. Что-то вроде C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe - person JohnnyFun; 17.02.2019

Вы на правильном пути, но вам не хватает параметра. Если вы хотите указать имя сценария, вы должны использовать следующий параметр при выполнении msbuild:

/p:PublishScriptFileName=[your output script.sql]
person Erlis Vidal    schedule 09.04.2013