Zwei Datenbanken automatisch miteinander vergleichen

Wenn man in der Datenbankentwicklung tätig ist kommt es des Öfteren mal vor, dass man zwei Datenbanken miteinander vergleichen möchte wie beispielsweise das Produktivsystem mit dem Testsystem oder zwei Testsysteme untereinander. Besonders cool wäre eine Lösung mit der man Datenbanken automatisch zeitgesteuert vergleichen kann um Unterschiede aufzudecken und aus dem Ergebnis dieser Aktion dann einen Bericht zu generieren der aufzeigt was in den Datenbanken unterschiedlich ist. Natürlich geht das wunderbar über die Oberfläche der SQL Server Data Tools:

062614_1456_ZweiDatenba1

Der Nachteil an dieser Methode liegt aber darin, dass man das nicht wirklich automatisieren kann. Zum Glück ist aber auch das Kommandozeilen-Tool sqlpackage.exe Bestandteil der SQL Server Data Tools mit dem man einen Vergleich automatisieren kann. Ich habe keinen Weg gefunden zwei Datenbanken direkt zu vergleichen, daher gehe ich den Weg zunächst aus beiden Datenbanken DACPACs zu exportieren und diese dann miteinander zu vergleichen. Dazu habe ich das folgende PowerShell Script geschrieben (geht aber auch als normale Batch-Datei).

Cls

cd"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin"

#FGE: Extract local Database

.\sqlpackage /Action:Extract /SourceConnectionString:"Data Source=192.168.137.119;Initial Catalog=TestDB;Persist Security Info=True;User ID=Admin;Password=!test123" /OverwriteFiles:True /TargetFile:"C:\temp\LocalDatabase.dacpac"

cd "C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin"

#FGE: Extract production Database

.\sqlpackage /Action:Extract /SourceConnectionString:"Data Source=192.168.137.119;Initial Catalog=TestDB2;Persist Security Info=True;User ID=Admin;Password=!test123" /OverwriteFiles:True /TargetFile:"C:\temp\Productio


#FGE: Generate DeployReportnDatabase.dacpac"

.\sqlpackage /Action:DeployReport /SourceFile:"C:\temp\LocalDatabase.dacpac"/TargetFile:"C:\temp\ProductionDatabase.dacpac" /OverwriteFiles:True /OutputPath:"C:\temp\DeployReport.xml" /TargetDatabaseName:"TestDB2"

Die erste Zeile extrahiert die lokale Datenbank, die zweite Zeile die Produktionsdatenbank als DACPAC. In der dritten Zeile wird von der lokalen Datenbank auf die Produktionsdatenbank verglichen, d.h. der generiert Deployment Bericht zeigt an was an der Produktivdatenbank geändert werden muss, damit sie auf dem gleichen Stand wie die lokale Datenbank ist. In unserem Beispiel habe ich in der lokalen Datenbank eine Stored Procedure mit vier Extended Properties angelegt. Der generierte Deployment Bericht sieht dementsprechend aus:

<?xml version="1.0" encoding="utf-8"?>                  
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">            
<Alerts />      
  <Operations>      
      <Operation Name="Create">            
         <Item Value="[dbo].[testproc]" Type="SqlProcedure" />                  
         <Item Value="[dbo].[testproc].[Execution_Sample]" Type="SqlExtendedProperty" />                 
         <Item Value="[dbo].[testproc].[MS_Description]" Type="SqlExtendedProperty" />                 
         <Item Value="[dbo].[testproc].[Author]" Type="SqlExtendedProperty" />                 
         <Item Value="[dbo].[testproc].[Project]" Type="SqlExtendedProperty" />                
      </Operation>      
  </Operations>      
</DeploymentReport>

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

%d Bloggern gefällt das: