In meinem neuen Job haben wir mehrere benannte Instanzen auf jedem Server. z.B
- Server1 \ Dev
- Server1 \ DevIntegrated
- Server1 \ QA
Ich habe ein SQL PowerShell-Skript in Arbeit, das das Betriebssystem aufruft, Foo.exe
aber einen Befehlszeilenparameter (die Verbindungszeichenfolge) übergeben muss. Auf jeder Instanz ist ein SQL Agent-Auftrag mit einem Schritt vom Typ PowerShell vorhanden, der den aktuellen Kontext kennen muss. dh Diese Ausführung begann am DevIntegrated.
Ich möchte nicht, dass jedes Skript mit ... beginnt.
$thisInstance = "Dev"
... vor allem, weil ich das ändern muss, wenn wir in den kommenden Monaten auf Umgebungen (neue Server und benannte Instanzen) migrieren.
Wenn ich SQLPS starte, kann ich meine Instanz bestimmen, indem ich die Ergebnisse von Get-Location zerlege und zerlege oder ausführe
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Wenn der SQL-Agent einen Auftrag vom Typ PowerShell startet, wird er im Get-Location
Verzeichnis C: \ windows \ system32 gestartet, und die Route funktioniert nicht, da sie nicht im SQLSERVER-Kontext enthalten ist. Ich kann in diesen Kontext wechseln, aber ich befinde mich im "Stammverzeichnis" von SQL Server und weiß nicht, in welcher Instanz ich mich befinden soll. Die Verwendung der Invoke-Sqlcmd
Route funktioniert auch nicht aus dem gleichen Grund (technisch gesehen läuft das Zeitlimit wie dort ab) ist keine Standardinstanz)
Nach meinem besten Wissen habe ich alle grundlegenden "Dinge" aufgelistet, die ich in das Jobprotokoll aufnehmen kann, aber nichts scheint zu zeigen SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
Es scheint, als könnte ich das und ein bisschen Voodoo gebrauchen, wenn ich versuche, Dinge zusammenzubasteln, indem ich auf die Instanzen treffe und Spids zusammenpasse. Es muss etwas Grundlegendes geben, das mir fehlt. Kann jemand etwas Licht ins Dunkel bringen?
Alternativen zu PowerShell untersucht
Ich hatte mit anderen Jobtypen nachgeforscht und keine zufriedenstellende Lösung erhalten. Nachforschungen haben ergeben, dass es sich bei der unter SQL Agent aufgelisteten PowerShell um SQLPS handelt, und das Starten einer Instanz durch Klicken mit der rechten Maustaste auf den Agent hat mich automatisch an den richtigen Speicherort gebracht. Erst als ich meinen interaktiven Code in den Auftragsschritt eingefügt habe, habe ich von dem Unterschied erfahren, wie bereits erwähnt.
Der Job-Typ des Betriebssystems versetzte mich in einen identischen Zustand, in dem ich keinen Weg finden konnte, um zu bestimmen, welche Instanz mich in die Befehlsshell fallen ließ. Klar, ich könnte sqlcmd und den Wert von @@servername
abrufen, aber wenn ich wüsste, welche Verbindung ich zum Starten von sqlcmd benötige, müsste ich die Datenbank nicht abfragen;)
TSQL könnte wahrscheinlich funktionieren, wenn wir es aktivieren, xp_cmdshell
aber ich bin nicht sicher, ob sie es aktiviert haben - Regierungsfunktion und sie können bei nicht standardmäßigen Einstellungen hartnäckig sein. Sogar dann bin ich mit dynamischem SQL beschäftigt und verliere einen Großteil der Ausdruckskraft und Kraft, die PowerShell verleiht.
Ich war zwar etwas unpraktisch, dachte aber, ich definiere eine Variable im ersten Schritt und übergebe sie an die Nachfolgeschritte. Nachforschungen ergaben jedoch, dass dieser Artikel Umgang mit mehreren Auftragsschritten (BOL)
Jobschritte müssen in sich geschlossen sein. Das heißt, ein Job kann keine Booleschen Werte, Daten oder numerischen Werte zwischen Jobschritten übergeben. Sie können jedoch Werte von einem Transact-SQL-Auftragsschritt an einen anderen übergeben, indem Sie permanente Tabellen oder globale temporäre Tabellen verwenden. Sie können Werte von Jobschritten, die ausführbare Programme ausführen, mithilfe von Dateien von einem Jobschritt an einen anderen Jobschritt übergeben.
Ich kann keine allgemeinen Tricks wie eine bekannte Datei- / Umgebungsvariablen- / Registrierungseinstellung verwenden, nach der Foo.exe
gesucht wird, da dies die gleichzeitige Ausführung über Instanzen hinweg verhindern würde.
TL; DR:
Wie können Sie in einem SQL Agent-Auftragsschritt vom Typ PowerShell die Instanz von SQL Server ermitteln, die den Prozess gestartet hat?