2017-03-09 3 views
0

Lors de la construction, nous générons des fichiers dacpac de notre base de données en fonction d'un SSDT .sqlproject. Ce dacpac est ensuite déployé en production à l'aide de sqlpackage. Malgré l'utilisation du commutateur/p: DropStatisticsNotInSource = False, sqlpackage supprimera toutes les statistiques ajoutées après la dernière synchronisation du projet sql avec la base de données de production.SSDT/SqlPackage abandonne les statistiques

Nous pouvons également reproduire cela en utilisant un profil de publication et l'option Générer script de 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> 

Comment pouvons-nous forcer sqlpackage ne pas faire tomber les statistiques?

+0

La vérification réelle est de vérifier le script généré, pas les paramètres qui lui sont transmises. Que fait le script? Est-ce que 'DropObjectsNotInSource' est intentionnellement défini sur' True'? –

+1

Exécutez la dernière version de sqlpackage.exe (dacfx) sur le serveur de déploiement? – ErikEJ

+0

@PanagiotisKanavos Oui, nous voulons vraiment supprimer les tables, les colonnes et les procédures stockées dans notre base de données Je cours VS2015 avec le dernier SSDT installé et a également essayé VS2017. Les deux produisent le même script de migration (avec DROP STATISTICS xyz.abc) –

Répondre

2

Le problème est l'utilisation de DropObjectsNotInSource=True, il écrase l'option DropStatisticsNotInSource=False. Ceci est un bogue ou n'est pas spécifié dans la documentation sqlpackage.exe.

Une solution de contournement possible consiste à utiliser le filtre SSDT AgileSqlClub par Ed Elliott comme expliqué dans this blog. Dans ce cas, vous devez utiliser le AgileSqlClub.SqlPackageFilter.dll et ajoutez l'option suivante:

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