Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come automatizzare il processo di sincronizzazione dello schema del database di SQL ServerSQL Server

L'obiettivo

Mantenere due database sincronizzati è un'attività che incontriamo spesso quando si lavora allo sviluppo e alla manutenzione di database SQL. Un caso particolare è questo:le versioni di un database presenti negli ambienti di test e sviluppo devono essere sincronizzate in modo coerente per assicurarsi che i test vengano eseguiti sulla versione più recente. Questo dovrebbe essere fatto rilevando le modifiche allo schema nella versione di sviluppo di un database e quindi sincronizzandole automaticamente con la versione dall'ambiente di test su base pianificata.

Come raggiungerlo

Esamineremo come è possibile ottenere la sincronizzazione automatizzata di due database SQL combinando uno strumento di confronto degli schemi con gli script e la pianificazione di PowerShell.

Nell'esempio che vedremo, i database verranno sincronizzati ogni 15 minuti. Poiché utilizziamo uno strumento di confronto degli schemi, possiamo essere sicuri che il database verrà aggiornato solo se ci sono alcune modifiche effettive tra le versioni di sviluppo e di test del database:ciò impedisce l'esecuzione di operazioni non necessarie che richiedono molte risorse.

Useremo Devart Schema Compare come utilità preferita per differenziare e sincronizzare i database di SQL Server. È uno strumento che consente di confrontare e sincronizzare database, snapshot e backup di SQL Server live. Diamo un'occhiata a come possiamo implementare il nostro progetto di seguito.

Configurazione

Prima di tutto, dovremo impostare alcune cose:

  1. Esegui confronto schema
  2. Fai clic su "Confronto nuovo schema ' pulsante sulla barra degli strumenti o, in alternativa, nella parte in alto a destra della pagina iniziale:
  3. Nella Sorgente e Destinazione scheda del Confronto nuovo schema finestra, scegli i database di origine e di destinazione desiderati:
  4. Nelle Opzioni , Mappatura degli schemiMappatura delle tabelle schede, è possibile impostare le opzioni di confronto e sincronizzazione necessarie:
  5. Quando tutto è impostato, puoi premere "Confronta ' pulsante nell'angolo in basso a destra per avviare il processo di confronto.
  6. Al termine del confronto, puoi vedere tutti gli oggetti che sono stati confrontati e il rispettivo stato di differenza nella parte superiore della finestra, mentre lo script dettagliato per ciascuno di questi oggetti si troverà in basso:
  7. Seleziona tutti gli oggetti per includerli nel processo di sincronizzazione e fai clic su "Salva ' o premi File> Salva :Questo salverà il progetto con tutte le informazioni necessarie per avviare il processo di sincronizzazione.
  8. Una volta salvato il progetto, fai clic su "Sincronizza oggetti ' pulsante:
  9. Procedura guidata di sincronizzazione dello schema sarà aperto. Innanzitutto, seleziona "Esegui lo script direttamente sul database di destinazione ' nell'Uscita scheda:
  10. Puoi scegliere le impostazioni necessarie nelle Opzioni scheda:
  11. Puoi controllare tutti gli oggetti che verranno sincronizzati nel Riepilogo scheda:
  12. Fai clic su 'Sincronizza ' nell'angolo in basso a destra per testare il processo di sincronizzazione.
  13. Vedrai i risultati visualizzati nel riquadro inferiore della finestra:

Automatizzazione del processo

Poiché la sincronizzazione dello schema è riuscita e ora che abbiamo un file di progetto con tutte le informazioni necessarie, automatizziamo il processo di sincronizzazione utilizzando uno script di PowerShell.

Nell'esempio seguente si presuppone che si utilizzi la sicurezza integrata, ma è comunque possibile accedere facilmente al database archiviato e crittografato dal file di progetto, insieme alle credenziali del repository.

Esamineremo alcune parti del processo di creazione dello script che potrebbero essere particolarmente interessanti, ma sentiti libero di saltare questa sezione per scaricare e testare subito lo script finito.

Creazione di uno script

Innanzitutto, dovremo creare una funzione che controlli se la cartella Output esiste. Lo scopo di questa cartella è archiviare i riepiloghi dei commit contrassegnati dai dati. La funzione dovrebbe assomigliare a questa:

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

Successivamente, definiremo la cartella principale e la posizione dei riepiloghi di output dello schema:

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

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

Ora dovremo definire la posizione di Schema Compare, la variabile data e i parametri dell'applicazione:

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

Con questo in atto, possiamo impostare il percorso del file di registro di output:

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

Successivamente, chiameremo Schema Compare e consentiremo che esegua i suoi parametri di sincronizzazione:

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

$message = ""

La parte finale del copione servirà a definire tutti i possibili esiti:

  1. Sono state rilevate modifiche allo schema, codice di ritorno 0 – Operazione riuscita
  2. Nessuna modifica allo schema rilevata, codice restituito 100– Nessuna modifica allo schema rilevata
  3. Si è verificato un errore e verrà aperto il riepilogo dell'output.
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

Programmazione

Con lo script PowerShell pronto e il processo automatizzato, possiamo programmarlo in diversi modi, ad es. tramite l'Utilità di pianificazione di Windows.

Visualizzazione dei risultati

Ora che il lavoro pianificato è attivo e in esecuzione, puoi visualizzare i riepiloghi dell'output dello schema ogni volta che ne hai bisogno. Nell'esempio appena visto, la variabile $outsLoc ha definito la posizione dei riepiloghi di output dello schema. Di conseguenza, tali riepiloghi verranno salvati in $rootFolder\$outsLoc, in questo caso particolare, SchemaSync\Outputs:

Se si verifica un errore, ad es. l'estensione di un file di progetto è stata inserita in modo errato, nel riepilogo di output verrà visualizzato il messaggio di errore corrispondente.

L'elenco dei codici di errore restituiti ci aiuterà a comprendere meglio l'errore specifico che abbiamo riscontrato.

[expand title =”SCRIPT COMPLETO “]

#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

[/espandi]

In caso di domande o problemi durante il processo di configurazione, non esitare a contattarci in qualsiasi momento all'indirizzo [email protected]