如何阻止SSDT部署DACPAC时删除运行时创建的Partition Schemes?
解决SSDT部署DACPAC时删除运行时创建的Partition Schemes的方案
方案1:自定义部署贡献者拦截删除操作
SSDT支持通过自定义部署贡献者修改部署计划,这是最彻底的解决方式:
- 实现
IDeploymentPlanModifier接口,编写逻辑识别运行时创建的Partition Schemes(可通过命名规则或标记区分),从部署计划中移除对应的删除操作 - 将代码编译为DLL后,部署时通过以下参数加载:
/p:AdditionalDeploymentContributors=你的自定义贡献者名称 /p:AdditionalDeploymentContributorPaths=贡献者DLL所在路径
方案2:修改项目文件排除分区对象
手动编辑.sqlproj文件,添加属性明确排除分区相关对象的比较与处理:
<PropertyGroup> <SqlDeploymentExcludeObjectTypes>PartitionSchemes;PartitionFunctions</SqlDeploymentExcludeObjectTypes> </PropertyGroup>
同时确保项目中不包含任何运行时创建的Partition Schemes定义,避免DACPAC将其判定为冗余对象。
方案3:配置发布配置文件强制忽略差异
在.pubxml发布配置文件中添加以下配置,覆盖默认部署规则:
<PropertyGroup> <IgnorePartitionSchemes>True</IgnorePartitionSchemes> <IgnoreObjectPlacementOnPartitionScheme>True</IgnoreObjectPlacementOnPartitionScheme> <DoNotDropObjectType>PartitionSchemes;PartitionFunctions</DoNotDropObjectType> </PropertyGroup>
部署时确保该配置文件被正确加载,避免命令行参数覆盖设置。
方案4:分离静态与动态分区对象
将SSDT需要管理的静态Partition Schemes/Functions保留在项目中,运行时创建的动态分区对象完全独立于SSDT的架构定义。部署时SSDT仅处理项目内的对象,不会触及未定义的动态分区方案。
内容的提问来源于stack exchange,提问作者Ross Presser
相关产品推荐
相关产品推荐

