如何从 Azure DevOps 管道中的 DACPAC 部署中排除特定表或列?

How can I exclude specific tables or columns from DACPAC deployment in Azure DevOps pipelines?

提问人:Tahami Rizwan 提问时间:10/5/2023 最后编辑:Tahami Rizwan 更新时间:10/14/2023 访问量:114

问:

我正在使用 Azure DevOps 管道来部署 DACPAC 来更新我的 SQL Server 数据库。但是,我需要排除某些对象,例如 tables/sp's/indexes 在部署期间更新。有没有办法在DACPAC部署中实现这种粒度级别?如果是这样,我应该使用哪些步骤或配置来实现此目的?

azure-devops azure-pipelines sql-server-data-tools dacpac

评论

0赞 Ceeno Qi-MSFT 10/6/2023
SqlAzureDacpacDeploymentV1 的本文档中,此任务引用了用于完成工作流的工具。因此,我更希望您可以查看此文档以获取 SqlPackage Publish,然后转向支持。如果您的需求可以通过 实现,我想它也可以在管道部署中实现。SqlPackage.exeSqlPackage.exeSqlPackage.exe
0赞 Tahami Rizwan 10/6/2023
它有类似 /p:ExcludeObjectTypes=Users 的标签;要排除表的表。我想排除特定表。这可能吗?
0赞 Ceeno Qi-MSFT 10/9/2023
正如我所建议的,您的要求可能更可能是一种行为。因此,我更希望您可以转向 SSDT 进行进一步确认。SqlPackage.exe

答:

0赞 Dmitrij Kultasev 10/6/2023 #1

我不熟悉 DevOps 管道,但我认为该过程与 SSDT 类似。然后,您不能轻易排除正在更新的列,您可以执行以下操作:

  1. 创建项目:
  • 包含除该表之外的所有对象的主项目
  • 具有包含所有列的单个表的项目。将主项目引用为“同一项目”
  • 具有单个表的项目,没有一些列。将主项目引用为“同一项目”
  1. 使用部署参与者。它们允许您完全控制整个部署过程。这可能在云中不可用。
0赞 Ivan Starostin 10/14/2023 #2

这并不是 CICD 中部署部分项目的常见方案,但您可以使用部署参与者,它支持按名称相等或掩码过滤对象,例如*namepart*

筛选器应作为 sqlpackage CLI 参数传递:

...
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreSchema(BLAH)"

但是,如果您每次都需要排除不同的对象,那么您应该重新考虑您的方法并修复为什么总是有一些对象处于合法差异状态的原因。