In diesem Beitrag möchte ich anhand eines kurzen Beispiels Windows PowerShell vorstellen. Im hier gewählten Demoszenario wollen wir mit Hilfe von PowerShell den SSIS-Server von AgentJobs (bzw. dessen JobSteps) anpassen. Grund könnte beispielsweise eine Migration auf SQL Server 2014 sein.
Windows PowerShell ist eine SkriptSprache, die seit Windows 7 zusammen mit dem Betriebssystem ausgeliefert wird. Neben dem Ausführen von einzelnen Kommandos lässt PowerShell auch das Schreiben von Skripten und Skriptprogrammen zu. Ein Editor zum Schreiben von PowerShell Skripten (PowerShell ISE) wird mit der PowerShell Installation im Betriebssystem bereits mitgeliefert.
In unserem Beispiel wollen wir PowerShell zum Automatisieren wiederkehrender Aufgaben (hier dem Ändern des SSIS-Servers für mehrere AgentJobs) verwenden.
Im oben dargestellten Beispiel gibt es drei Agentjobs in denen wir den SSIS-Server von „IXTO-TEST-12“ auf „IXTO-TEST-14“ umstellen möchten. Bei drei Agentjobs ginge das zwar auch per Hand recht schnell, bei 30 ist das dann aber doch schon eine Menge Klickarbeit. Mit PowerShell reichen wenige Zeilen, um die hier beschriebene Aufgabe zu lösen.
Zuerst ein paar Vorbereitungen:
# test if SQLPS module loaded and if not, load it if (-not(Get-Module -name 'SQLPS')) { if (Get-Module -ListAvailable | Where-Object {$_.Name -eq 'SQLPS' }) { Push-Location Import-Module -Name 'SQLPS' -DisableNameChecking Pop-Location } }
Mit diesem Codeblock stellen wir sicher, dass alle benötigten Funktionen (das SQLPS-Modul) für unser PowerShell Skript zur Verfügung stehen. Das SQLPS-Modul enthält einen SQL-Server Provider für die Navigation innerhalb der SQL Server Instanz und einige weitere SQL Server spezifische Funktionen.
Als nächstes müssen wir eine Verbindung zu unserer SQL Server Instanz herstellen, in der wir die AgentJobs anpassen wollen.
# connect to SQL instance $srv = new-object ('Microsoft.SqlServer.Management.Smo.Server') 'IXTO-TEST-12'
Jetzt haben wir eine Verbindung zur SQL Server Instanz und müssen als letztes die einzelnen AgentJobs durchgehen und den SSIS-Server ändern.
# For each job on the server foreach($job in $srv.JobServer.Jobs) { # use this if-block to select relevant Agent Jobs if($job.Name -like "PSDemo*") { # loop through all jobsteps foreach($jobstep in $job.Jobsteps) { #Format of Commandstring for SSIS Package Tasks: '/SQL "\"\[Pfad]\"" /SERVER [Servername] /CHECKPOINT [ON/OFF] /REPORTING [E/...]' $jobstep.Command = $jobstep.Command -replace "IXTO-TEST-12", "IXTO-TEST-14"; $jobstep.Alter(); } $job.Alter(); } }
Dieser Codeblock beinhaltet zwei in einander verschachtelte Schleifen. Die äußere Schleife (Zeile 2) geht alle AgentJobs auf dem SQL Server durch die innere Schleife (Zeile 8) iteriert durch alle JobSteps des AgentJobs und ersetzt im Commandstring (Zeile 11) den alten SSIS-Server („IXTO-TEST-12“) durch den neuen SSIS-Server („IXTO-TEST-14“). Mit der IF-Bedingung (Zeile 5) stellen wir sicher, dass nur die für uns relevanten AgentJobs angepasst werden (und zwar alle AgentJobs deren Name mit „PSDemo“ beginnt). Die Funktion „Alter()“ speichert schließlich die vorgenommenen Änderungen.
Diese drei Codeblöcke genügen um das gesetzte Ziel zu erreichen.
Genauso einfach lassen sich Tabellen- und Datenbankeigenschaften bearbeiten. Viele Szenarien sind denkbar (z.B. Prüfen und Sicherstellen von Namenskonventionen, Maintenance Tasks wie Index Rebuild, das Durchführen von Backups, …). Windows PowerShell Skripte lassen sich auch in einen AgentJob integrieren und zeitgesteuert ausführen.