13.06.2017

Automatisiertes Deployment einer BI Solution – Teil 3: SSDT

Technical Value

In den ersten beiden Teilen meiner Serie habe ich gezeigt, wie SSIS Projekte und Environments mit der Power Shell deployed werden können. Nun möchte ich auf die Bereitstellung von Datenbankprojekten eingehen.

In vielen unserer Projekte verwenden wir SQL Server Data Tools (SSDT) zur Modellierung der Datenbanken. Daher benötigt das hier vorgestellte Vorgehen die dacpac-Datei, welche beim Build der SSDT Solution erstellt wird. Alternativ könnten auch einzelne SQL-Scripte über die Power Shell gegen die gewünschte Datenbank ausgeführt werden.

SSDT ist bereits ein mächtiges Tool. Und auch das Deployment kann direkt aus dem Visual Studio heraus ausgeführt werden. Jedoch haben wir eine Hürde zu überwinden, wenn der Administrator nicht über ein Visual Studio mit Data Tools verfügt.

Stattdessen kann auf Basis von SSDT bzw. der dacpac-Datei ein Deltascript erstellt werden, das gegen die Zieldatenbank ausgeführt wird. Genau diese Schritte automatisiert das im Folgenden dargestellte PowerShell-Script.

Parameter erstellen

Wir erstellen einige Parameter, um das Script universell verwenden zu können. Dabei werden der Name des Zielservers und der Ablageort der dacpac-Datei(en) abgefragt:

  1. #Variablen deklarieren
  2.  
  3. param (
  4.    # erforderliche Parameter
  5.    [string]$sqlServerName = $(Read-Host "SQL Server Name"),
  6.    [string]$dacpacFolderPath = $(Read-Host "Ordern mit Dacpac Datei(en)")
  7. )

Generierung des Deltascriptes aus SSDT

Für die Generierung des Delta-Scriptes wird das Kommandozeilen-Tool SqlPackage verwendet.  Dieses liegt standardmäßig im Verzeichnis C:\Program Files (x86)\Microsoft SQL Server\<SQL Server Version>\DAC\bin. Die Einstellungen sollten den eigenen Bedürfnissen angepasst werden. Eine ausführliche Übersicht aller Einstellungen findet sich in der MSIDN: https://msdn.microsoft.com/en-us/library/hh550080%28v=vs.103%29.aspx.

Die Datenbankprojekte tragen bei uns den Namen der Zieldatenbank. Sollte dies nicht der Fall sein, darf im Script nicht der Name des dacpacs verwendet werden.

  1. Write-Host "Creating Patchscripte from dacpac files..."
  2.  
  3. $files = Get-ChildItem $dacpacFolderPath -Filter *.dacpac foreach($file in $files) {
  4.  
  5.    $targetDbName = $file.Name.Split(".")[0]
  6.    $targetFileName = $dacpacFolderPath + "\" + $targetDbName + "_Patch.sql"
  7.    $sourceDacPac = $file.FullName
  8.  
  9.    $argumentList = @(
  10.      "/Action:Script",
  11.      "/p:ScriptDatabaseOptions=false",
  12.      "/p:CreateNewDatabase=false",
  13.      "/p:BlockOnPossibleDataLoss=false",
  14.      "/SourceFile:$sourceDacPac",
  15.      "/TargetServerName:$sqlServerName",
  16.      "/TargetDatabaseName:$targetDbName",
  17.      "/Outputpath:$targetFileName"
  18.    )
  19.  
  20.    & $sqlPackage $argumentList }

Ausführung des Deltascriptes

Das oben generierte Script kann nun manuell geprüft und ausgeführt werden. Ebenso ist es möglich, das Script direkt im Anschluss über die unten stehenden Befehle auszuführen.

Um neben dem generierten Deltascript auch weitere, manuell erstellte Scripte ausführen zu können, wird das gesamte Verzeichnis nach SQL-Scripten durchsucht. Sollen keine weiteren Scripte ausgeführt werden, kann natürlich auch direkt das generierte Script ausgeführt werden, ohne den Ordner noch einmal zu durchsuchen.

Damit das Script ausgeführt werden kann, muss das SqlSeverCmdletSnapin geladen sein:

  1. # add SqlServerCmdletSnapin if not already loaded
  2.  
  3. if((Get-PSSnapin -Name SqlServerCmdletSnapin100 -ErrorAction SilentlyContinue) -eq $null)
  4. {
  5.    Add-PSSnapin SqlServerCmdletSnapin100
  6. }
  7. # find all .sql files in given folder and subfolders
  8.  
  9. $files = get-childitem -recurse -Filter *.sql
  10.  
  11. foreach($file in $files)
  12. {
  13.      $databaseName = $file.Name.Split(“.”)[0]
  14.  
  15.      Write-Host "Executing" $file.Name "against" $databaseName "on server" $sqlServerName "..."
  16.  
  17.     # executing the sql file
  18.     invoke-sqlcmd -inputfile $file.FullName -serverinstance $sqlServerName -database $databaseName
  19. }
  20.  
  21. Write-Host "All Scripts executed"

Im nächsten Teil präsentiere ich noch das Deployment eines Analysis Services Cube. Damit sind die Hauptbestandteile einer BI-Solution abgedeckt.

Teilen auf

Newsletter Anmeldung

Abonnieren Sie unseren Newsletter!
Lassen Sie sich regelmäßig über alle Neuigkeiten rundum ORAYLIS und die BI- & Big-Data-Branche informieren.

Jetzt anmelden