1

在构建期间,我们基于 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 不删除统计信息?

4

1 回答 1

5

问题是使用DropObjectsNotInSource=True,它会覆盖DropStatisticsNotInSource=False选项。这要么是错误,要么未在sqlpackage.exe文档中指定。

一种可能的解决方法是使用 Ed Elliott 的 AgileSqlClub SSDT 过滤器,如本博客所述。在这种情况下,您需要使用AgileSqlClub.SqlPackageFilter.dll并添加以下选项:

/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor /p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreType(Statistics)"

于 2018-02-15T14:42:39.830 回答