【问题标题】:Can Sql Package Exe Run Post Deployment Script In Command Line?Sql Package Exe可以在命令行中运行部署后脚本吗?
【发布时间】:2019-08-14 06:07:08
【问题描述】:

下面将使用 sqlpackage.exe 部署 Sql 数据库。 这不需要使用发布配置文件 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 Post Deployment Script not running

更新(Steve Ford 下面的回答可能不起作用):

希望在没有任何外部文件的情况下从命令提示符执行此操作。史蒂夫的回答可能不适用于我的情况/问题。

【问题讨论】:

  • 查看我对我的回答的评论
  • 为什么不能创建普通的后置脚本并将其存储为文件?如果这不是一个选项,那么为什么不在 sqlpackage 完成后直接使用 sqlcmd 运行这个插入语句?
  • 嗨@DmitrijKultasev 只是好奇该选项是否存在,
  • 我认为您可以与部署贡献者一起做一些事情,但我从未听说过这样的原生功能
  • 您能否解释一下为什么使用 SQLPackage 可能不起作用。正如我在回答中所说,您唯一需要的文件是 dacpac 文件。除了 DACPAC 之外没有其他文件,部署后脚本是 DACPAC 的一部分。

标签: .net sql-server sql-server-2017 sqlpackage


【解决方案1】:

添加部署后脚本的方式需要你将它添加到项目中。

在此处查看 Microsoft 文档:MSDN Pre & post deployment scripts

要添加和修改部署前或部署后脚本,请使用解决方案资源管理器,展开您的数据库项目以显示 Scripts 文件夹。

右键单击脚本文件夹并选择添加。

在上下文菜单中选择脚本。

选择部署前脚本或部署后脚本。或者,指定一个非默认名称。点击添加完成。

双击 Scripts 文件夹中的文件。

Transact-SQL 编辑器打开,显示文件的内容。

您可以在脚本中使用 SQLCMD 语法和变量,并在数据库项目属性中进行设置。例如:

您可以使用 SQLCMD 语法在部署前或部署后脚本中包含文件的内容。包含文件并按照您定义它们的顺序运行: :r .\myfile.sql

您可以使用 SQLCMD 语法来引用部署后脚本中的变量。您在项目属性或发布配置文件中设置 SQLCMD 变量:

:setvar TableName MyTable  
insert into [$(TableName)] (SampleColumn) values ('1')   

【讨论】:

  • 我想在没有任何外部文件的情况下从命令提示符执行此操作
  • @MattSmith 没有外部文件,它们包含在您的 DacPac 中,请参阅 mssqltips.com/sqlservertutorial/3006/…c-sharpcorner.com/article/…
  • 嗨@SteveFord,我知道这可以通过数据库项目后部署脚本来完成,但是,这需要通过命令行来完成,例如这个SqlPackage.exe /Action:Publish /SourceFile:TestDatabase.dacpac /TargetDatabaseName:TestDb /TargetServerName:localhost /PostDeploymentScript:"插入 dbo.SampleTable (SampleColumn) 值 ('1')
  • @SteveFord 对您的问题有正确的解决方案。 sqlpackage 不会从命令行执行任何其他脚本。如果您不想从 sqlpackage 多次执行相同的脚本,请添加 if stmt 或在 dml 脚本中使用合并 stmt,您还应该尝试解释为什么在您的项目中使用 dml 脚本不是一个可接受的解决方案。如果您想添加其他脚本以从命令行运行,您可以使用 sqlcmd 或使用 dbup 或类似工具切换到部署。
  • 这将通过命令行执行。 SQLPackage 生成一个脚本,它执行它以进行更改,您添加到项目中的任何部署前或部署后脚本都将包含在此生成的脚本中并作为一个脚本执行,即 SQLPackage 将执行它,您无需执行任何其他操作: SqlPackage.exe /Action:Publish /SourceFile:TestDatabase.dacpac /TargetDatabaseName:TestDb /TargetServerName:localhost
【解决方案2】:

当您要求具体答案时,最好解释一下您究竟想要达到什么目标以及为什么。您可能会坚持使用特定的解决方案来解决可以通过多种不同方式解决的 1 个问题。

您要解决的真正问题是什么。如果问题在于 post/pre 脚本总是执行,那么您可能想要编写幂等脚本或使用一些只执行该脚本一次的功能。你可以查看我的答案here

如果您有其他原因,那么您也可以通过调用 sqlcmd 实用程序或任何其他可以从文件中执行语句并在 >sqlpackage.

现在回答您最初的问题。如果您想通过创建新变量来做到这一点,这就是您需要做的事情,比如说 ReplaceVariable 并将单行添加到 post 脚本:

$(ReplaceVariable)

然后运行

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

如果什么都不应该被执行,只需传递“--”之类的东西作为参数。

【讨论】:

  • 好的,谢谢,我仍然需要一个后置脚本,但可能没有解决方案,只是一个命令行类型的人,好的,无论如何谢谢
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
相关资源
最近更新 更多