如何在DacServices.Deploy()中禁用预部署和部署后脚本

我们有一些自动dacpac部署代码,可以使用Microsoft.SqlServer.Dac正确处理C#中的CreateNewDatabase和简单的Update数据库方案

现在,在CreateNewDatabase的情况下,我们希望能够在禁用前置和后置部署脚本的情况下运行DacServices.Deploy() 。 即它们不应该在这种情况下执行。

我试图在DacDeployOptionsDacServices对象中找到合适的位置,但找不到任何可以执行此操作的地方.Ideally

问题1我想要类似于DacDeployOptions.IgnorePreDeploymentScript = true有什么方法可以在运行时实现这一点吗?

作为替代方案,前段时间我记得看过示例代码,它展示了如何遍历dacpac并在运行时创建一个新的dacpac。 我认为这种方法可以让我简单地创建一个新的dacpac,我可以将其传递给Deploy,它将排除Pre和Post Deployment脚本。 我不喜欢这个解决方案,但它可以让我实现我所需要的。

问题2有人可以为我指出一些例子吗?

我的代码:

 var dacService = new DacServices(ConstDefaultConnectionString); using (var dacPackage = DacPackage.Load(dacPacFilePath)) { var deployOptions = new DacDeployOptions { CreateNewDatabase = true, IncludeTransactionalScripts = false }; dacService.Deploy(dacPackage, TestDatabaseName, true, deployOptions); } 

问题与以下内容有关: 创建LocalDB以便从Visual Studio SQL项目进行测试

你可以采取多种方法,这是一个大脑转储(嘿,时钟昨晚回来了,我甚至不确定当前时间):

1)使用相同的数据库引用创建一个引用主项目的空项目 – 当您在没有脚本的情况下部署时使用IncludeCompositeObjects部署空项目 – 前/后部署脚本仅从您部署的dacpac运行,而不是从任何引用的dacpacs运行但显然部署了代码和方案。 这描述了它:

https://the.agilesql.club/blog/Ed-Elliott/2016-03-03/Post-Deploy-Scripts-In-Composite-Dacpac-not-deploying

2)使用SQLCMD变量来包装数据设置并将值传递给deploy。

3)让脚本检查是否应该设置数据,如果表rowcount为零,则仅插入数据

4)对于参考数据使用合并脚本 – 我不清楚这是针对参考数据还是设置测试数据

5)使用.net packaging api从dacpac中删除前/后部署脚本,这将向您展示如何编写脚本,以便您能够执行GetPart而不是WritePart:

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

总的来说,我猜可能有一个更简单的解决方案 – 如果这是用于测试,那么可能使数据设置成为测试设置的一部分? 如果你是unit testingtSQLt通过使用FakeTable帮助你避免这一切。

希望能帮助到你 :)

埃德

要尝试两件事:

  1. 首先,如果您使用MSBuild ,那么执行此类操作非常容易,因为您可以定制特定的配置以包含一个或多个项目。 在.sqlproj文件中有一个部分,应该类似于以下内容:

         

    您只需添加“条件”即可确定是否使用该ItemGroup。 您可以在.sqlproj文件中看到这些“条件”属性(通常)。 所以结果应该类似于:

         

    然后,您只需在“Active Configuration”下拉列表中的“Release”或“Debug”之间切换,相应地包含或排除部署前后脚本。

  2. 另一个想法是以某种方式重置部署前后脚本。 由于您将DacPac加载到dacPackage ,因此您可以访问PreDeploymentScript和PostDeploymentScript属性。 我无法测试,但有可能“擦除”那里有什么(假设流已经指向存储的脚本)。