Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment automatiser le processus de synchronisation du schéma de base de données SQL Server

L'objectif

Garder deux bases de données synchronisées est une tâche que nous rencontrons souvent lorsque nous travaillons sur le développement et la maintenance de bases de données SQL. Un cas particulier est celui-ci - les versions d'une base de données présentes sur les environnements de test et de développement doivent être synchronisées de manière cohérente pour s'assurer que les tests s'exécutent sur la version la plus récente. Cela doit être fait en détectant les changements de schéma dans la version de développement d'une base de données, puis en les synchronisant automatiquement avec la version de l'environnement de test sur une base planifiée.

Comment y parvenir

Nous verrons comment la synchronisation automatisée de deux bases de données SQL peut être réalisée en combinant un outil de comparaison de schéma avec des scripts et une planification PowerShell.

Dans l'exemple que nous allons voir, les bases de données seront synchronisées toutes les 15 minutes. Comme nous utilisons un outil de comparaison de schémas, nous pouvons être sûrs que la base de données ne sera mise à jour que s'il y a des changements réels entre les versions de développement et de test de la base de données - cela évite l'exécution d'opérations inutiles gourmandes en ressources.

Nous utiliserons Devart Schema Compare comme utilitaire de choix pour différencier et synchroniser les bases de données SQL Server. C'est un outil qui vous permet de comparer et de synchroniser les bases de données, les instantanés et les sauvegardes SQL Server en direct. Voyons comment nous pouvons mettre en œuvre notre projet ci-dessous.

Configuration

Tout d'abord, nous devrons configurer certaines choses :

  1. Exécuter la comparaison de schémas
  2. Cliquez sur Nouvelle comparaison de schémas dans la barre d'outils ou, alternativement, dans la partie supérieure droite de la page de démarrage :
  3. Dans la source et la cible de l'onglet Nouvelle comparaison de schémas fenêtre, choisissez les bases de données source et cible souhaitées :
  4. Dans les Options , Mappage de schéma , et Mappage des tables onglets, vous pouvez configurer les options de comparaison et de synchronisation nécessaires :
  5. Lorsque tout est configuré, vous pouvez appuyer sur Comparer dans le coin inférieur droit pour démarrer le processus de comparaison.
  6. Lorsque la comparaison est terminée, vous pouvez voir tous les objets qui ont été comparés et leur statut de différence respectif dans la partie supérieure de la fenêtre, tandis que le script détaillé pour chacun de ces objets sera situé en bas :
  7. Cochez tous les objets pour les inclure dans le processus de synchronisation et cliquez sur Enregistrer ou appuyez sur Fichier> Enregistrer :Cela enregistrera le projet avec toutes les informations dont nous avons besoin pour démarrer le processus de synchronisation.
  8. Une fois le projet enregistré, cliquez sur "Synchroniser les objets ' bouton:
  9. Assistant de synchronisation de schéma sera ouvert. Tout d'abord, sélectionnez "Exécuter le script directement sur la base de données cible ' dans la sortie languette:
  10. Vous pouvez choisir les paramètres nécessaires dans les Options languette:
  11. Vous pouvez vérifier tous les objets qui vont être synchronisés dans le Résumé languette:
  12. Cliquez sur Synchroniser dans le coin inférieur droit pour tester le processus de synchronisation.
  13. Vous verrez les résultats affichés dans le volet inférieur de la fenêtre :

Automatiser le processus

Comme la synchronisation du schéma a réussi et maintenant que nous avons un fichier de projet avec toutes les informations nécessaires, automatisons le processus de synchronisation en utilisant un script PowerShell.

Dans l'exemple suivant, on suppose que vous utilisez la sécurité intégrée, mais la base de données stockée et chiffrée est toujours facilement accessible à partir du fichier de projet, ainsi que les informations d'identification du référentiel.

Nous examinerons certaines parties du processus de création de script qui peuvent être particulièrement intéressantes, mais n'hésitez pas à ignorer cette section pour télécharger et tester immédiatement le script fini.

Créer un scénario

Tout d'abord, nous devrons créer une fonction qui vérifie si le dossier Outputs existe. Le but de ce dossier est de stocker des résumés de validation horodatés. La fonction devrait ressembler à ceci :

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

Ensuite, nous définirons le dossier racine et l'emplacement des résumés de sortie de schéma :

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

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

Maintenant, nous devons définir l'emplacement de Schema Compare, la variable d'horodatage et les paramètres de l'application :

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

Une fois cela en place, nous pouvons définir le chemin d'accès au fichier journal de sortie :

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

Ensuite, nous appellerons Schema Compare et le laisserons exécuter ses paramètres de synchronisation :

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

$message = ""

La dernière partie du script servira à définir tous les résultats possibles :

  1. Les modifications de schéma sont détectées, code de retour 0 – Réussite
  2. Aucune modification de schéma détectée, code de retour 100– Aucune modification de schéma détectée
  3. Une erreur s'est produite et le récapitulatif de sortie va s'ouvrir.
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

Planification

Avec le script PowerShell prêt et le processus automatisé, nous pouvons planifier cela de différentes manières, par ex. via le planificateur Windows.

Affichage des résultats

Maintenant que la tâche planifiée est opérationnelle, vous pouvez afficher les résumés de sortie du schéma à tout moment. Dans l'exemple que nous venons de voir, la variable $outsLoc définit l'emplacement des résumés de sortie du schéma. Par conséquent, ces résumés seront enregistrés dans $rootFolder\$outsLoc - dans ce cas particulier, SchemaSync\Outputs :

Si une erreur est rencontrée, par ex. l'extension d'un fichier de projet est saisie de manière incorrecte, le message d'erreur correspondant s'affichera dans le résumé de sortie.

La liste des codes d'erreur de retour nous aidera à mieux comprendre l'erreur spécifique que nous avons rencontrée.

[expand title =»SCRIPT COMPLET “]

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

Si des questions ou des problèmes surviennent pendant le processus de configuration, n'hésitez pas à nous contacter à tout moment à [email protected]