2017-03-09 2 views
0

Während des Builds generieren wir Dacpac-Dateien unserer Datenbank basierend auf einem SSDT .sqlproject. Dieser Dacpac wird später mit sqlpackage zur Produktion bereitgestellt. Trotz der Verwendung des/p: DropStatisticsNotInSource = False-Schalters wird sqlpackage alle Statistiken löschen, die nach der letzten Synchronisierung von sqlproject mit der Produktionsdatenbank hinzugefügt wurden.SSDT/SqlPackage fallen Statistiken

Wir können auch reproduzieren dies ein Profil veröffentlichen verwenden und das Skript Option von SSDT erzeugen:

<?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> 

Wie können wir zwingen sqlpackage die Statistik nicht fallen zu lassen?

+0

Die eigentliche Prüfung ist das generierte Skript zu prüfen, nicht die an sie übergebenen Parametern. Was macht das Skript? Ist 'DropObjectsNotInSource' absichtlich auf' True' gesetzt? –

+1

Führen Sie die aktuelle Version von sqlpackage.exe (dacfx) auf dem Bereitstellungsserver aus? – ErikEJ

+0

@PanagiotisKanavos Ja, wir wollen tatsächlich Tabellen, Spalten und gespeicherten Prozeduren in unserer Datenbank fallen lassen Ich laufe VS2015 mit der neuesten SSDT installiert und versuchte auch VS2017. Beide erzeugen dasselbe Migrations-Skript (mit DROP STATISTICS xyz.abc) –

Antwort

2

Das Problem ist die Verwendung von DropObjectsNotInSource=True, es überschreibt die Option DropStatisticsNotInSource=False. Dies ist entweder ein Fehler oder ist nicht in der Dokumentation sqlpackage.exe angegeben.

Eine mögliche Problemumgehung besteht darin, AgileSqlClub SSDT-Filter von Ed Elliott wie in this blog erläutert zu verwenden. In diesem Fall müssen Sie die AgileSqlClub.SqlPackageFilter.dll und fügen Sie folgende Option verwenden:

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