Aufgrund der besseren Wartbarkeit sind bei unseren Projekten die Datenbank-Skripte für die Entwickler in kleine Häppchen geteilt. Für Kunden benötigen wir aber natürlich nur ein Skript, das alle Änderungen in einer Datei zusammen fasst.
Da ich mich schon immer mal mit der Powershell beschäftigen wollte, dachte ich, das wäre mal eine gute Gelegenheit damit mal rumzuspielen.
Entstanden ist daraus das folgende Skript:
# -------------------------------
# GenerateDatabaseUpdate.ps1
# Author: Karim El Jed
# -------------------------------
# Mit diesem Skript können mehrere kleine Datenbankskripte zu einer Datei zusammengefasst werden.
#
# PARAMETER:
# -from Die Datenbankversion, die aktualisiert werden soll (immer in der Form "x.y" angeben!)
#
# -to Die Datenbankversion auf die aktualisiert werden soll (immer in der Form "x.y" angeben!)
#
# -dir Spezifiziert das Verzeichnis, in dem die Ordner mit den Update-Skripten sind
#
# BEISPIEL:
# .\GenerateDatabaseUpdate.ps1 -from 1.0 -to 1.3 -dir C:\temp\Updates
#
# Die einzelnen Skripte müssen in Ordnern unterhalb des in dir spezifizierten Verzeichnisses in der richtigen Reihenfolge (nach Namen sortiert) liegen.
# Beispiel: "010_Skript1.sql", "020_Skript2.sql"
# Die Unterordner müssen der Namenskonvention "[minorversion] to [majorversion]" folgen.
#
# c:\temp\updates
# -> 1.0 to 1.1
# -> 1.1 to 1.2
# -> 1.2 to 1.3
param([string]$dir, [string]$from, [string]$to)
$directory = new-object IO.DirectoryInfo($dir)
write-host "Dir:" $directory.FullName
$fileName = $directory.FullName + "\update " + $from + " to " + $to + ".sql"
$file = new-object IO.FileInfo($filename)
write-host $file.Fullname
if($file.Exists)
{
$file.Delete()
}
$dirs = $directory.GetDirectories("* to *")
$nl = [Environment]::NewLine
foreach ($d in $dirs)
{
$s = @($d.Name.Split(" "))
$f1 = [float]::Parse($s[0].Replace(".", ","))
$f2 = [float]::Parse($s[2].Replace(".", ","))
if($f1 -ge $from)
{
if($f2 -le $to)
{
$parseDir = $directory.FullName + "\" + $s[0] + " to " + $s[2]
$nl + "-- ++++++++++++++ " + $s[0] + " to " + $s[2] + " ++++++++++++++" + $nl >> $filename
dir $parseDir | foreach-object { Get-Content $_.FullName >> $fileName }
write-host "$parseDir ..."
}
}
}
write-host "$nl Skript saved as '$filename' $nl"