在构建期间,我们基于SSDT .sqlproject生成数据库的dacpac文件。此dacpac稍后使用sqlpackage部署到生产中。 尽管使用了/ p:DropStatisticsNotInSource = False开关,sqlpackage将删除在sqlproject与生产数据库最后一次同步后添加的所有统计信息。
我们还可以使用发布配置文件和SSDT的生成脚本选项来重现这一点:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>hotel</TargetDatabaseName>
<DeployScriptFileName>Database.sql</DeployScriptFileName>
<TargetConnectionString>connectionstring</TargetConnectionString>
<BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
<DropObjectsNotInSource>True</DropObjectsNotInSource>
<DoNotDropDatabaseRoles>True</DoNotDropDatabaseRoles>
<DoNotDropDatabaseScopedCredentials>True</DoNotDropDatabaseScopedCredentials>
<DoNotDropUsers>True</DoNotDropUsers>
<DoNotDropServerRoles>True</DoNotDropServerRoles>
<DoNotDropSecurityPolicies>True</DoNotDropSecurityPolicies>
<DoNotDropSearchPropertyLists>True</DoNotDropSearchPropertyLists>
<DoNotDropPermissions>True</DoNotDropPermissions>
<DoNotDropPartitionSchemes>True</DoNotDropPartitionSchemes>
<DoNotDropPartitionFunctions>True</DoNotDropPartitionFunctions>
<DoNotDropExternalFileFormats>True</DoNotDropExternalFileFormats>
<DoNotDropExternalTables>True</DoNotDropExternalTables>
<DoNotDropErrorMessages>True</DoNotDropErrorMessages>
<DoNotDropDefaults>False</DoNotDropDefaults>
<ProfileVersionNumber>1</ProfileVersionNumber>
<DropStatisticsNotInSource>False</DropStatisticsNotInSource>
<ScriptRefreshModule>False</ScriptRefreshModule>
</PropertyGroup>
</Project>
我们如何强制sqlpackage不丢弃统计信息?
答案 0 :(得分:2)
问题是使用DropObjectsNotInSource=True
,它会覆盖DropStatisticsNotInSource=False
选项。这可能是错误,也未在sqlpackage.exe
文档中指定。
一种可能的解决方法是使用Ed的AgileSqlClub SSDT过滤器
艾略特正如this blog中所解释的那样。在这种情况下,您需要使用AgileSqlClub.SqlPackageFilter.dll
并添加以下选项:
/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreType(Statistics)"