Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So automatisieren Sie den Prozess der Synchronisierung des SQL Server-Datenbankschemas

Das Ziel

Zwei Datenbanken synchron zu halten ist eine Aufgabe, der wir oft begegnen, wenn wir an der Entwicklung und Wartung von SQL-Datenbanken arbeiten. Ein besonderer Fall ist dieser – die Versionen einer Datenbank, die in Test- und Entwicklungsumgebungen vorhanden sind, müssen konsistent synchronisiert werden, um sicherzustellen, dass Tests auf der neuesten Version ausgeführt werden. Dies sollte erfolgen, indem Schemaänderungen in der Entwicklungsversion einer Datenbank erkannt und dann automatisch und planmäßig mit der Version aus der Testumgebung synchronisiert werden.

Wie man es erreicht

Wir werden untersuchen, wie eine automatisierte Synchronisierung von zwei SQL-Datenbanken erreicht werden kann, indem ein Schemavergleichstool mit PowerShell-Skripten und Zeitplanung kombiniert wird.

In dem Beispiel, das wir sehen werden, werden die Datenbanken alle 15 Minuten synchronisiert. Da wir ein Schemavergleichstool verwenden, können wir sicher sein, dass die Datenbank nur aktualisiert wird, wenn es einige tatsächliche Änderungen zwischen der Entwicklungs- und der Testversion der Datenbank gibt – dies verhindert die Ausführung unnötiger ressourcenintensiver Operationen.

Wir verwenden Devart Schema Compare als bevorzugtes Dienstprogramm zum Vergleichen und Synchronisieren von SQL Server-Datenbanken. Es ist ein Tool, mit dem Sie Live-SQL Server-Datenbanken, Snapshots und Backups vergleichen und synchronisieren können. Schauen wir uns unten an, wie wir unser Projekt umsetzen können.

Einrichtung

Zunächst müssen wir einige Dinge einrichten:

  1. Schemavergleich ausführen
  2. Klicken Sie auf Neuer Schemavergleich Schaltfläche in der Symbolleiste oder alternativ oben rechts auf der Startseite:
  3. In derQuelle und im Ziel Registerkarte Neuer Schemavergleich Wählen Sie im Fenster die gewünschten Quell- und Zieldatenbanken aus:
  4. In den Optionen , Schemazuordnung und Tabellenzuordnung Registerkarten können Sie die notwendigen Vergleichs- und Synchronisationsoptionen einrichten:
  5. Wenn alles eingerichtet ist, können Sie auf Vergleichen klicken ‘ Schaltfläche in der unteren rechten Ecke, um den Vergleichsprozess zu starten.
  6. Wenn der Vergleich abgeschlossen ist, können Sie alle verglichenen Objekte und ihren jeweiligen Unterschiedsstatus im oberen Teil des Fensters sehen, während sich das detaillierte Skript für jedes dieser Objekte unten befindet:
  7. Markieren Sie alle Objekte, um sie in den Synchronisierungsprozess aufzunehmen und klicken Sie auf Speichern Schaltfläche oder drücken Sie Datei> Speichern :Dadurch wird das Projekt mit allen Informationen gespeichert, die wir zum Starten des Synchronisierungsprozesses benötigen.
  8. Sobald das Projekt gespeichert ist, klicken Sie auf „Objekte synchronisieren ' Taste:
  9. Assistent für die Schemasynchronisierung wird geöffnet. Wählen Sie zuerst „Das Skript direkt für die Zieldatenbank ausführen aus ‘ in der Ausgabe Tab:
  10. Sie können die notwendigen Einstellungen in den Optionen vornehmen Tab:
  11. Sie können alle Objekte, die synchronisiert werden sollen, in der Zusammenfassung überprüfen Tab:
  12. Klicken Sie auf Synchronisieren in der unteren rechten Ecke, um den Synchronisierungsprozess zu testen.
  13. Die Ergebnisse werden im unteren Bereich des Fensters angezeigt:

Automatisierung des Prozesses

Da die Schemasynchronisierung erfolgreich war und wir nun eine Projektdatei mit allen erforderlichen Informationen haben, lassen Sie uns den Synchronisierungsprozess mithilfe eines PowerShell-Skripts automatisieren.

Im folgenden Beispiel wird davon ausgegangen, dass Sie die integrierte Sicherheit verwenden, aber auf die gespeicherte und verschlüsselte Datenbank kann trotzdem problemlos von der Projektdatei aus zusammen mit den Repository-Anmeldeinformationen zugegriffen werden.

Wir werden uns einige Teile des Skripterstellungsprozesses ansehen, die besonders interessant sein könnten, aber Sie können diesen Abschnitt gerne überspringen, um das fertige Skript sofort herunterzuladen und zu testen.

Skript erstellen

Zuerst müssen wir eine Funktion erstellen, die prüft, ob der Outputs-Ordner existiert. Der Zweck dieses Ordners besteht darin, datengestempelte Commit-Zusammenfassungen zu speichern. Die Funktion sollte so aussehen:

#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

    #setting up its location 
    if($Outputs -eq $true)
{
$location += "\Outputs"
}
   
    #creating the folder if it doesn't currently exist
    if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }

return $location
}

Als Nächstes definieren wir den Stammordner und den Speicherort der Zusammenfassungen der Schemaausgabe:

#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"

#defining the location of schema output summaries 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs

Jetzt müssen wir den Speicherort von Schema Compare, die Datumsstempelvariable und Parameter der Anwendung definieren:

#Schema Compare location and the date stamp variable are defined, as well as  the tool’s parameters 
$diffLoc   = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com"
$stamp = (Get-Date -Format "Mmddyyyy_HHMMss")

Damit können wir den Pfad zur Ausgabeprotokolldatei festlegen:

#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"

Als Nächstes rufen wir Schema Compare auf und lassen es seine Synchronisationsparameter ausführen:

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
$returnCode = $LASTEXITCODE

$message = ""

Der letzte Teil des Skripts dient dazu, alle möglichen Ergebnisse zu definieren:

  1. Schemaänderungen werden erkannt, Rückgabecode 0 – Erfolg
  2. Keine Schemaänderungen erkannt, Rückgabecode 100 – Keine Schemaänderungen erkannt
  3. Ein Fehler ist aufgetreten und die Ausgabezusammenfassung wird geöffnet.
if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"
       
$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
       
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
       
#schema changes are detected
}
if($returnCode -eq 0)
{
 $message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
 #there are no schema changes
 if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath

Planung

Wenn das PowerShell-Skript bereit und der Prozess automatisiert ist, können wir dies auf verschiedene Arten planen, z. über den Windows-Scheduler.

Ergebnisse anzeigen

Nachdem der geplante Job ausgeführt wurde, können Sie bei Bedarf jederzeit Zusammenfassungen der Schemaausgabe anzeigen. In dem Beispiel, das wir gerade gesehen haben, definierte die Variable $outsLoc den Speicherort der Zusammenfassungen der Schemaausgabe. Daher werden solche Zusammenfassungen in $rootFolder\$outsLoc gespeichert – in diesem speziellen Fall SchemaSync\Outputs:

Wenn ein Fehler auftritt, z. Wird die Erweiterung einer Projektdatei falsch eingegeben, wird die entsprechende Fehlermeldung in der Ausgabezusammenfassung angezeigt.

Die Liste der Rückgabefehlercodes hilft uns, den spezifischen Fehler, auf den wir gestoßen sind, besser zu verstehen.

[expand title =”VOLLSTÄNDIGES SKRIPT „]

#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

    #setting up its location 
    if($Outputs -eq $true)
{
$location += "\Outputs"
}
   
    #creating the folder if it doesn't currently exist
    if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }

return $location
}

#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"

#defining the location of schema output summaries 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs 

#Schema Compare location and the date stamp variable are defined, as well as  the tool’s parameters 
$diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com"
$stamp = (Get-Date -Format "Mmddyyyy_HHMMss")

#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
$returnCode = $LASTEXITCODE

$message = ""

if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"

$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
       
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
       
#schema changes are detected
}
if($returnCode -eq 0)
{
$message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
#there are no schema changes
if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath

[/expandieren]

Sollten während des Einrichtungsprozesses Fragen oder Probleme auftreten, können Sie sich jederzeit unter [email protected]

an uns wenden