Bei der Architektur einer Datenbank gilt es nach einer Testphase oder nach Änderungen oftmals diese komplett neu aus den beteiligten Skripten zu erzeugen. Um zu viel manuelle Arbeit zu vermeiden erzeuge ich mir dazu ein weiteres Skript, welches neben der Installation der Datenbank auch alle beteiligten Skripte in fest definierter Reihenfolge ausführt.

Das Ausführen der Skripte aus aus einer Datei erfolgt über den Befehl xp_cmdshell. Dieser macht nichts weiter, als einen Befehl an die Windows-Kommandozeile weiter zu erreichen. Der Befehl ist im Standardfall allerdings sicherheitsbeschränkt, weshalb die Konfiguration vorher geändert werden muss.

Folgende Schritte sind dazu notwendig:

  1. Löschen der Datenbank falls diese existiert
  2. Datenbank neu erstellen
  3. Berechtigung konfigurieren, um Skripte aus Dateien auszuführen
  4. Konstanten deklarieren und initialisieren
  5. Skript-Dateien in eine temporäre Tabelle einfügen
  6. Diese Tabelle in einer Schleife durchlaufen und die Skripte aus den Dateien ausführen

Sehen wir uns einige der Schritte im Detail an:

Schritt 3:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1

GO

-- To update the currently configured value for advanced options.
RECONFIGURE

GO

-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1

GO

-- To update the currently configured value for this feature.
RECONFIGURE

Mit diesem Schnipsel werden die erweiterten Berechtigungen für den xp_cmdshell-Befehl gesetzt.

Schritt 6:

DECLARE item_cursor CURSOR FOR
	SELECT FileName FROM @ScriptFiles
	OPEN item_cursor
	FETCH NEXT FROM item_cursor INTO @executionPath
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @executionPath = 'sqlcmd -S ' + @serverName + ' -d ' + @dbName + ' -i "' + @scriptsDirectory + @executionPath + '"'

		EXEC xp_cmdshell @executionPath

		FETCH NEXT FROM item_cursor INTO @executionPath
	END
CLOSE item_cursor
DEALLOCATE item_cursor

Für die Schleife nutze ich einen Cursor um eine Tabelle zu durchlaufen. Denkbar ist natürlich auch die Umsetzung über eine temporäre Tabelle.

In Zeile 7 wird der komplette Parameter für denn xp_cmdshell zusammengefügt. Die zusätzlichen Anführungszeichen sorgen dafür, dass Pfade mit Leerzeichen fehlerfrei ausgeführt werden.

Das komplette Skript kann hier heruntergeladen werden: Masterskript für SQL-Dateien