sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man automatiserar processen för SQL Server Databas Schema Synchronization

Målet

Att hålla två databaser synkroniserade är en uppgift vi ofta stöter på när vi arbetar med utveckling och underhåll av SQL-databas. Ett särskilt fall är detta – versionerna av en databas som finns på test- och utvecklingsmiljöer måste synkroniseras konsekvent för att säkerställa att testerna körs på den senaste versionen. Detta bör göras genom att upptäcka schemaändringar i utvecklingsversionen av en databas och sedan automatiskt synkronisera dem med versionen från testmiljön på schemalagd basis.

Hur du uppnår det

Vi ska undersöka hur automatiserad synkronisering av två SQL-databaser kan uppnås genom att kombinera ett verktyg för schemajämförelse med PowerShell-skript och schemaläggning.

I exemplet vi ska se kommer databaserna att synkroniseras var 15:e minut. Eftersom vi använder ett schemajämförelseverktyg kan vi vara säkra på att databasen endast kommer att uppdateras om det finns några faktiska förändringar mellan utvecklings- och testversionerna av databasen – detta förhindrar exekvering av onödiga resurstunga operationer.

Vi kommer att använda Devart Schema Compare som valfritt verktyg för att differentiera och synkronisera SQL Server-databaser. Det är ett verktyg som låter dig jämföra och synkronisera live SQL Server-databaser, ögonblicksbilder och säkerhetskopior. Låt oss titta på hur vi kan implementera vårt projekt nedan.

Inställningar

Först och främst måste vi ställa in några saker:

  1. Kör Schema Compare
  2. Klicka på Ny schemajämförelse knappen i verktygsfältet eller alternativt i den övre högra delen av startsidan:
  3. IKälla och mål fliken Ny schemajämförelse fönster, välj önskad käll- och måldatabaser:
  4. I Alternativ , Schema Mapping och Tabellmappning flikar kan du ställa in nödvändiga jämförelse- och synkroniseringsalternativ:
  5. När allt är konfigurerat kan du trycka på Jämför knappen i det nedre högra hörnet för att starta jämförelseprocessen.
  6. När jämförelsen är klar kan du se alla objekt som har jämförts och deras respektive skillnadsstatus i den övre delen av fönstret, medan det detaljerade skriptet för vart och ett av dessa objekt kommer att finnas längst ned:
  7. Kontrollera alla objekt för att inkludera dem i synkroniseringsprocessen och klicka på Spara eller tryck på Arkiv> Spara :Detta sparar projektet med all information vi behöver för att starta synkroniseringsprocessen.
  8. När projektet har sparats klickar du på "Synkronisera objekt ' knapp:
  9. Guiden Schemasynkronisering kommer att öppnas. Välj först "Kör skriptet direkt mot måldatabasen ' i Utdata flik:
  10. Du kan välja de nödvändiga inställningarna i Alternativ flik:
  11. Du kan kontrollera alla objekt som ska synkroniseras i Sammanfattningen flik:
  12. Klicka på Synkronisera i det nedre högra hörnet för att testa synkroniseringsprocessen.
  13. Du kommer att se resultaten som visas i den nedre rutan i fönstret:

Automatisera processen

Eftersom schemasynkroniseringen var framgångsrik och nu när vi har en projektfil med all nödvändig information, låt oss automatisera synkroniseringsprocessen genom att använda ett PowerShell-skript.

I följande exempel antas det att du använder integrerad säkerhet, men den lagrade och krypterade databasen kan fortfarande lätt nås från projektfilen, tillsammans med arkivuppgifterna.

Vi kommer att titta på några delar av manusskapandet som kan vara särskilt intressanta, men hoppa gärna över det här avsnittet för att ladda ner och testa det färdiga manuset direkt.

Skapa ett skript

Först måste vi skapa en funktion som kontrollerar om mappen Outputs finns. Syftet med den här mappen är att lagra datastämplade åtagandesammanfattningar. Funktionen ska se ut så här:

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

Därefter kommer vi att definiera rotmappen och platsen för schemautdatasammanfattningar:

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

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

Nu måste vi definiera Schema Compares plats, datumstämpelvariabeln och applikationens parametrar:

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

Med detta på plats kan vi ställa in sökvägen till utdataloggfilen:

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

Därefter kommer vi att anropa Schema Compare och låta det utföra sina synkroniseringsparametrar:

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

$message = ""

Den sista delen av skriptet kommer att tjäna till att definiera alla möjliga resultat:

  1. Schemaändringar har upptäckts, returnera kod 0 – Framgång
  2. Inga schemaändringar upptäckta, returkod 100– Inga schemaändringar upptäckta
  3. Ett fel har påträffats och utdatasammanfattningen kommer att öppnas.
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

Schemaläggning

Med PowerShell-skriptet klart och processen automatiserad kan vi schemalägga detta på några olika sätt, t.ex. via Windows Scheduler.

Visa resultat

Nu när det schemalagda jobbet är igång kan du se schemautdata när som helst du behöver. I exemplet vi just såg definierade variabeln $outsLoc platsen för schemautdatasammanfattningar. Som ett resultat kommer sådana sammanfattningar att sparas i $rootFolder\$outsLoc – i det här fallet SchemaSync\Outputs:

Om något fel uppstår, t.ex. en projektfils tillägg är felaktigt angett, motsvarande felmeddelande kommer att visas i utdatasammanfattningen.

Listan med returfelkoder hjälper oss att bättre förstå det specifika felet vi stötte på.

[expand title =”FULLSTÄNDIG 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

[/expand]

Om några frågor eller problem uppstår under processen att ställa in detta, kontakta oss gärna när som helst på [email protected]


  1. CONVERT_TZ – Hur man ändrar MySQL-tidszon i Query

  2. ett effektivt sätt att testa om det finns en tabellrad

  3. Nodejs uttrycker och lovar att inte göra vad jag förväntar mig

  4. dela nyckelord för post php mysql