sql >> Database >  >> RDS >> Sqlserver

Het proces van synchronisatie van SQL Server-databaseschema's automatiseren

Het doel

Het synchroon houden van twee databases is een taak die we vaak tegenkomen bij het werken aan de ontwikkeling en het onderhoud van SQL-databases. Een specifiek geval is dit:de versies van een database die aanwezig zijn in test- en ontwikkelomgevingen moeten consistent worden gesynchroniseerd om ervoor te zorgen dat tests worden uitgevoerd op de meest recente versie. Dit moet worden gedaan door schemawijzigingen in de ontwikkelversie van een database te detecteren en deze vervolgens op geplande basis automatisch te synchroniseren met de versie uit de testomgeving.

Hoe dit te bereiken

We zullen onderzoeken hoe geautomatiseerde synchronisatie van twee SQL-databases kan worden bereikt door een schemavergelijkingstool te combineren met PowerShell-scripts en planning.

In het voorbeeld dat we gaan zien, worden de databases elke 15 minuten gesynchroniseerd. Omdat we een schemavergelijkingstool gebruiken, kunnen we er zeker van zijn dat de database alleen wordt bijgewerkt als er daadwerkelijke wijzigingen zijn tussen de ontwikkelings- en testversies van de database - dit voorkomt het uitvoeren van onnodige, resource-intensieve bewerkingen.

We gebruiken Devart Schema Compare als het favoriete hulpprogramma om SQL Server-databases te differentiëren en te synchroniseren. Het is een tool waarmee u live SQL Server-databases, snapshots en back-ups kunt vergelijken en synchroniseren. Laten we eens kijken hoe we ons project hieronder kunnen implementeren.

Instellen

Allereerst moeten we een aantal dingen instellen:

  1. Voer Schema Vergelijking uit
  2. Klik op de Nieuwe schemavergelijking ' knop op de werkbalk of, als alternatief, in de rechterbovenhoek van de startpagina:
  3. In deBron en Doel tabblad van de Nieuwe schemavergelijking venster, kies de gewenste bron- en doeldatabase:
  4. In de Opties , Schematoewijzing , en Tabeltoewijzing tabbladen, kunt u de nodige vergelijkings- en synchronisatie-opties instellen:
  5. Als alles is ingesteld, kun je op Vergelijken . drukken ' knop in de rechterbenedenhoek om het vergelijkingsproces te starten.
  6. Als de vergelijking is voltooid, kun je alle objecten die zijn vergeleken en hun respectieve verschilstatus in het bovenste deel van het venster zien, terwijl het gedetailleerde script voor elk van die objecten onderaan staat:
  7. Vink alle objecten aan om ze in het synchronisatieproces op te nemen en klik op Opslaan ' knop of druk op Bestand> Opslaan :Hiermee wordt het project opgeslagen met alle informatie die we nodig hebben om het synchronisatieproces te starten.
  8. Zodra het project is opgeslagen, klikt u op de knop 'Objecten synchroniseren ' knop:
  9. Wizard Schemasynchronisatie wordt geopend. Selecteer eerst 'Voer het script rechtstreeks uit tegen de doeldatabase ' in de Uitvoer tabblad:
  10. U kunt de benodigde instellingen kiezen in de Opties tabblad:
  11. U kunt alle objecten die worden gesynchroniseerd controleren in de Samenvatting tabblad:
  12. Klik op Synchroniseren ' in de rechterbenedenhoek om het synchronisatieproces te testen.
  13. U ziet de resultaten in het onderste deelvenster van het venster:

Het proces automatiseren

Aangezien schemasynchronisatie succesvol was en nu we een projectbestand met alle benodigde informatie hebben, laten we het synchronisatieproces automatiseren met behulp van een PowerShell-script.

In het volgende voorbeeld wordt aangenomen dat u geïntegreerde beveiliging gebruikt, maar de opgeslagen en versleutelde database is nog steeds gemakkelijk toegankelijk vanuit het projectbestand, samen met de inloggegevens van de repository.

We zullen enkele delen van het scriptcreatieproces bekijken die bijzonder interessant kunnen zijn, maar sla deze sectie gerust over om het voltooide script meteen te downloaden en te testen.

Een script maken

Eerst moeten we een functie maken die controleert of de map Uitvoer bestaat. Het doel van deze map is om met data gestempelde commit-samenvattingen op te slaan. De functie zou er als volgt uit moeten zien:

#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
}

Vervolgens definiëren we de hoofdmap en de locatie van de samenvattingen van de schema-uitvoer:

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

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

Nu moeten we de locatie van Schema Compare, de datumstempelvariabele en parameters van de applicatie definiëren:

#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")

Als dit op zijn plaats is, kunnen we het pad naar het uitvoerlogbestand instellen:

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

Vervolgens zullen we Schema Compare aanroepen en het zijn synchronisatieparameters laten uitvoeren:

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

$message = ""

Het laatste deel van het script zal dienen om alle mogelijke uitkomsten te definiëren:

  1. Schemawijzigingen gedetecteerd, retourcode 0 – Geslaagd
  2. Geen schemawijzigingen gedetecteerd, retourcode 100– Geen schemawijzigingen gedetecteerd
  3. Er is een fout opgetreden en het uitvoeroverzicht wordt geopend.
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

Planning

Met het PowerShell-script gereed en het proces geautomatiseerd, kunnen we dit op een aantal verschillende manieren plannen, b.v. via de Windows-planner.

Resultaten bekijken

Nu de geplande taak actief is, kunt u schema-uitvoeroverzichten op elk gewenst moment bekijken. In het voorbeeld dat we zojuist zagen, definieerde de variabele $outsLoc de locatie van schema-uitvoersamenvattingen. Als gevolg hiervan worden dergelijke samenvattingen opgeslagen in $rootFolder\$outsLoc – in dit specifieke geval SchemaSync\Outputs:

Als er een fout wordt aangetroffen, b.v. de extensie van een projectbestand onjuist is ingevoerd, wordt de bijbehorende foutmelding weergegeven in het uitvoeroverzicht.

De lijst met retourfoutcodes helpt ons om de specifieke fout die we zijn tegengekomen beter te begrijpen.

[titel uitbreiden =”VOLLEDIGE SCRIPT "]

#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

[/uitbreiden]

Als er vragen of problemen optreden tijdens het opzetten hiervan, neem dan gerust contact met ons op via [email protected]


  1. Paginering met OFFSET / FETCH:een betere manier

  2. Een dynamisch gegenereerde draaitabel in een tijdelijke tabel krijgen

  3. Kolomnamen van Oracle DB aanhalingstekens

  4. Combineer twee kolommen en voeg toe aan één nieuwe kolom