exporter la structure d’une base avec Powershell

Le code ci-dessous peut être sauvegardé dans un fichier .ps1, pour être utilisé comme script. Changez simplement l’adresse de votre serveur SQL à la ligne 3, et le chemin de sauvegarde des scripts à la ligne 17. Il va exporter toutes les structures de vos bases de données dans des sous-répertoires, dans un répertoire nommé selon le moment de l’exécution. Cela vous permet de conserver plusieurs versions de votre export, et d’utiliser un programme de diff (comme WinMerge) pour voir les différences.

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null

$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" ".\SQL2008"
$so = New-Object "Microsoft.SqlServer.Management.Smo.ScriptingOptions";
#$so.ScriptDrops = $TRUE;
$so.IncludeIfNotExists = $TRUE;
$so.AppendToFile = $FALSE
$so.ToFileOnly = $TRUE
$so.AnsiFile = $TRUE
$so.ConvertUserDefinedDataTypesToBaseType = $TRUE
$so.DriAll = $TRUE
$so.Permissions = $TRUE
$so.Triggers = $TRUE
$so.PrimaryObject = $TRUE

#$path = "~/db_scripts/"
$path = "c:/temp/db_scripts/$((Get-Date f 'yyyyMMdd-HHmm'))/"
if (!(Test-Path -path $path)) { Mkdir $path }

foreach ($db in $srv.Databases) {
    if (!$db.IsSystemObject) {
        $localPath = $path+$db.Name+"/"
        if (!(Test-Path -path ($localPath))) { Mkdir ($localPath) }
       
        if (!(Test-Path -path ($localPath+"tables/"))) { Mkdir ($localPath+"tables/") }
        foreach ($tbl in $db.tables) {
            if (!$tbl.IsSystemObject) {
                $so.FileName = $localPath+"tables/"+$tbl.Schema+"."+$tbl.Name+".tbl.sql"
                #Write-Host "criture de $($tbl.Name) dans $($so.FileName)"
                $so.FileName
                $tbl.Script($so)
                #$tbl.Script($so) > [$tbl.Name].tbl.sql
            } # if (!$tbl.IsSystemObject)
        } # foreach $tbl
        if (!(Test-Path -path ($localPath+"procedures/"))) { Mkdir ($localPath+"procedures/") }
        foreach ($sp in $db.StoredProcedures) {
            if (!$sp.IsSystemObject) {
                $so.FileName = $localPath+"procedures/"+$sp.Schema+"."+$sp.Name+".sp.sql"
                $so.FileName
                $sp.Script($so)
            } # if (!$tbl.IsSystemObject)
        } # foreach $sp
        if (!(Test-Path -path ($localPath+"vues/"))) { Mkdir ($localPath+"vues/") }
        foreach ($vw in $db.Views) {
            if (!$vw.IsSystemObject) {
                $so.FileName = $localPath+"vues/"+$vw.Schema+"."+$vw.Name+".view.sql"
                $so.FileName
                $vw.Script($so)
            } # if (!$tbl.IsSystemObject)
        } # foreach $vw
    } # if ($db.IsSystemObject)
} # foreach $db

Laisser un commentaire