如何阻止SqlPackage在部署过程中关闭Query Store?
一、阻止SqlPackage关闭Query Store
SqlPackage默认会在生成部署脚本或执行部署时调整Query Store配置(比如临时关闭它),目的是避免部署过程中出现性能瓶颈或锁冲突,但我们可以通过一个参数完美阻止这个行为:
你需要在现有的SqlPackage命令中添加这个参数:
/p:QueryStoreOptions=Preserve
这个参数的作用是告诉SqlPackage完全保留目标数据库的Query Store现有配置——包括启用状态、捕获模式、清理策略等,不会生成任何修改Query Store的脚本语句。
修改后的完整脚本示例:
sqlPackage.exe /Action:Script ` /SourceFile:"myPath\MyDatabaseName.dacpac" ` /OutputPath:"myPath\TheseAreMyChangesThatWillBeApplied.sql" ` /TargetConnectionString:"Integrated Security=true;server=MyServer;database=MyDatabase;" ` /p:DropObjectsNotInSource=false ` /p:DropPermissionsNotInSource=false ` /p:DropRoleMembersNotInSource=false ` /p:BlockOnPossibleDataLoss=True ` /Variables:"CrossDatabaseRefs=CrossDatabaseRefs" ` /p:QueryStoreOptions=Preserve
如果之后你需要执行/Action:Publish(直接部署而非生成脚本),同样可以加上这个参数,Query Store会保持启用状态,不会被临时关闭。
二、更简便的数据库部署方案
你现在用自定义PowerShell脚本调用SqlPackage的方式虽然稳定,但确实有更高效的替代方案,适合团队协同维护的场景:
1. 使用发布配置文件(*.pubxml)集中管理参数
Visual Studio数据库项目支持创建发布配置文件,你可以把所有部署参数(目标连接字符串、Drop选项、Query Store设置等)都保存到这个文件里,然后SqlPackage可以直接调用配置文件,不用在脚本里写一堆零散参数:
- 在Visual Studio中右键数据库项目 → 发布 → 配置好所有部署选项(包括刚才的Query Store保留设置) → 点击“保存配置文件”,生成如
Dev.pubxml、Test.pubxml这类对应不同环境的配置文件。 - 把配置文件纳入版本控制,让所有开发者和CI流程共用一致的配置。
- 调用SqlPackage时只需指定配置文件:
sqlPackage.exe /Action:Script /Profile:"myPath\Dev.pubxml" /OutputPath:"myPath\DevChanges.sql"
这种方式减少了脚本复杂度,也避免了不同环境参数不一致的问题。
2. 用TFS 2018内置的数据库部署任务替代自定义脚本
TFS 2018 vNext的Build/Release流程里有内置的SQL Server数据库部署任务,它已经封装了SqlPackage的所有功能,不需要手写PowerShell脚本:
- 在Release pipeline中添加“SQL Server Database Deployment”任务。
- 配置任务参数:选择编译后的dacpac文件、目标数据库连接、部署选项(比如是否阻止数据丢失、保留不在源中的对象等),还可以直接设置Query Store的保留策略。
- 任务会自动处理SqlPackage的调用,生成变更脚本(可选)并执行部署,比自定义脚本更直观,也减少了出错概率。
3. 补充:部署前的自动化验证
如果想进一步优化流程,可以在部署前添加两个检查步骤:
- 用
/Action:DriftReport生成目标数据库与Dacpac的漂移报告,检查是否有未纳入版本控制的变更。 - 用
/Action:DeployReport生成部署影响报告,提前评估变更对数据库的影响(比如是否会导致数据丢失、是否修改了关键表结构)。
这些步骤可以集成到CI流程中,作为部署前的质量闸门,确保部署安全性。
内容的提问来源于stack exchange,提问作者J. Erik Thompson

