Может ли Sql Package Exe запускать сценарий пост-развертывания из командной строки?

Далее будет развернута база данных Sql с sqlpackage.exe. Это не требует использования Publish Profile Xml. Есть ли способ добавить простой встроенный скрипт после развертывания без внешнего файла после развертывания?

Например: будет публиковать базу данных в оперативном режиме, без профиля публикации xml.

SqlPackage.exe 
/Action:Publish 
/SourceFile:TestDatabase.dacpac
/TargetDatabaseName:TestDb
/TargetServerName:localhost

Теперь цель добавить сценарий пост-развертывания в командную строку, например, вставить значение в примерную таблицу.

Предполагаемая цель:

SqlPackage.exe 
/Action:Publish 
/SourceFile:TestDatabase.dacpac
/TargetDatabaseName:TestDb
/TargetServerName:localhost
/PostDeploymentScript:"insert into dbo.SampleTable (SampleColumn) values ('1')"

Не удается найти встроенную опцию сценария после развертывания на веб-сайте Microsoft. Может, его не существует.

https://docs.microsoft.com/en-us/sql/tools/sqlpackage?view=sql-server-2017

Скрипт пост-развертывания SQLPackage не запущен

Обновление (ответ Стива Форда ниже может не сработать):

Хотите провести это из командной строки без каких-либо внешних файлов. Ответ Стива может не сработать для моей ситуации / вопроса.


person Community    schedule 14.08.2019    source источник
comment
Смотрите мой комментарий к моему ответу   -  person Steve Ford    schedule 20.08.2019
comment
Почему вы не можете создать обычный почтовый скрипт и сохранить его в виде файла? Если это не вариант, то почему бы просто не запустить этот оператор вставки с помощью sqlcmd сразу после завершения sqlpackage?   -  person Dmitrij Kultasev    schedule 21.08.2019
comment
привет @DmitrijKultasev, просто интересно, существует ли такая возможность,   -  person    schedule 21.08.2019
comment
Я думаю, что вы можете что-то сделать с участниками развертывания, но я никогда не слышал о таких встроенных функциях   -  person Dmitrij Kultasev    schedule 21.08.2019
comment
Не могли бы вы объяснить, почему использование SQLPackage может не работать. Как я уже сказал в своем ответе, вам нужен только файл dacpac. Нет никаких других файлов, кроме DACPAC, сценарий после развертывания является частью DACPAC.   -  person Steve Ford    schedule 23.08.2019


Ответы (2)


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

См. Документацию Microsoft здесь: Скрипты MSDN до и после развертывания

Чтобы добавить и изменить сценарий до или после развертывания, используйте обозреватель решений, разверните проект базы данных, чтобы отобразить папку сценариев.

Щелкните правой кнопкой мыши папку «Сценарии» и выберите «Добавить».

В контекстном меню выберите Сценарии.

Выберите сценарий перед развертыванием или сценарий после развертывания. При желании укажите имя, отличное от имени по умолчанию. Щелкните Добавить, чтобы закончить.

Дважды щелкните файл в папке Scripts.

Откроется редактор Transact-SQL, отображающий содержимое файла.

Вы можете использовать синтаксис и переменные SQLCMD в своих скриптах и ​​установить их в свойствах проекта базы данных. Например:

Вы можете использовать синтаксис SQLCMD для включения содержимого файла в сценарий до или после развертывания. Файлы включены и запускаются в том порядке, в котором вы их определяете:: r. \ Myfile.sql

Вы можете использовать синтаксис SQLCMD для ссылки на переменную в сценарии после развертывания. Вы устанавливаете переменную SQLCMD в свойствах проекта или в профиле публикации:

:setvar TableName MyTable  
insert into [$(TableName)] (SampleColumn) values ('1')   
person Steve Ford    schedule 19.08.2019
comment
Я хочу провести это из командной строки без каких-либо внешних файлов - person ; 19.08.2019
comment
@MattSmith нет внешних файлов, они включены в ваш DacPac, см. mssqltips.com/sqlservertutorial/3006/ и c-sharpcorner.com/article/ - person Steve Ford; 20.08.2019
comment
Привет @SteveFord, я знаю, что это можно сделать с помощью сценария пост-развертывания проекта базы данных, однако это нужно сделать с помощью командной строки, всего, например, этого SqlPackage.exe / Action: Publish /SourceFile:TestDatabase.dacpac / TargetDatabaseName : TestDb / TargetServerName: localhost / PostDeploymentScript: вставить в значения dbo.SampleTable (SampleColumn) ('1') - person ; 20.08.2019
comment
У @SteveFord есть правильное решение вашего вопроса. sqlpackage не будет выполнять никаких дополнительных скриптов из командной строки. Если вы не хотите выполнять один и тот же скрипт несколько раз из sqlpackage, добавьте if stmt или используйте merge stmt в своем dml-скрипте, вам также следует попытаться объяснить, почему наличие dml-скрипта в вашем проекте не является приемлемым решением. если вы хотите добавить дополнительный скрипт для запуска из командной строки, вы можете использовать sqlcmd или переключиться на развертывание с помощью dbup или аналогичного инструмента. - person Daniel N; 20.08.2019
comment
Это будет выполнено через командную строку. SQLPackage генерирует сценарий, который он выполняет для внесения изменений, любой сценарий до или после развертывания, который вы добавляете в свой проект, будет включен в этот сгенерированный сценарий и выполнен как один, т.е. SQLPackage выполнит его, вам не нужно будет делать ничего, кроме: SqlPackage.exe / Действие: Опубликовать /SourceFile:TestDatabase.dacpac / TargetDatabaseName: TestDb / TargetServerName: localhost - person Steve Ford; 21.08.2019

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

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

Если у вас есть другие причины для этого, вы также можете добиться этого, вызвав утилиту sqlcmd или любую другую, которая может выполнить оператор из файла и запустить эту утилиту сразу после sqlpackage < / сильный>.

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

$(ReplaceVariable)

а затем запустить

sqlpackage.exe 
   /Action:Publish        
   /SourceFile:"Database1.dacpac" 
   /TargetDatabaseName:TestDb 
   /TargetServerName:localhost 
   /Variables:ReplaceVariable="insert into a values (1);"

и если ничего не должно выполняться, просто передайте что-то вроде "-" в качестве аргумента.

person Dmitrij Kultasev    schedule 22.08.2019
comment
Хорошо, спасибо, мне все равно понадобится почтовый скрипт, но, вероятно, нет решения, просто человек типа командной строки, хорошо, в любом случае спасибо - person ; 23.08.2019