Nel mio nuovo lavoro, abbiamo più istanze denominate su ciascun server. per esempio
- Server1 \ Dev
- Server1 \ DevIntegrated
- Server1 \ QA
Ho uno script SQL PowerShell nelle opere che chiama il sistema operativo, invoca Foo.exe
ma deve passare un parametro della riga di comando (la stringa di connessione). Esisterà un processo di SQL Agent su ogni istanza, con un passaggio di tipo PowerShell, che deve sapere qual è il contesto corrente. cioè questa esecuzione è iniziata su DevIntegrated.
Non desidero che ogni sceneggiatura inizi con ...
$thisInstance = "Dev"
... soprattutto perché dovrei modificarlo quando migreremo negli ambienti (nuovi server e istanze denominate) nei prossimi mesi.
Se avvio SQLPS, posso determinare la mia istanza tagliando e tagliando i risultati di Get-Location o eseguendoli
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Quando SQL Agent avvia un lavoro di tipo PowerShell, si avvia in C: \ windows \ system32 e il Get-Location
percorso non funziona poiché non si trova nel contesto SQLSERVER. Posso cambiare in quel contesto, ma sarò alla "radice" di SQL Server e non saprò in quale istanza dovrei trovarmi. L'uso del Invoke-Sqlcmd
percorso non funzionerà neanche per lo stesso motivo (tecnicamente, va in timeout in quanto lì non è un'istanza predefinita)
Per quanto ne so, ho elencato tutte le "cose" di base che posso inserire nel registro dei lavori, ma nulla sembra mostrare SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
sembra che potrei usarlo e un po 'di voodoo nel cercare di mettere insieme le cose colpendo le istanze e abbinando gli spid, ma sembra proprio un maledetto hack dall'inferno. Ci deve essere qualcosa di fondamentale che mi manca, qualcuno può far luce?
Sono state studiate alternative a PowerShell
Avevo studiato utilizzando altri tipi di lavoro e non avevo ottenuto una risoluzione soddisfacente. La ricerca ha indicato che PowerShell elencato in SQL Agent era SQLPS e l'avvio di un'istanza di esso facendo clic con il pulsante destro del mouse sull'agente mi ha automaticamente portato nella posizione corretta. È stato solo quando ho incollato il mio codice interattivo nella fase di lavoro che ho appreso della differenza come precedentemente menzionato.
Il tipo di lavoro del sistema operativo mi ha messo in uno stato identico in quanto non sono riuscito a trovare un modo per determinare quale istanza mi ha lasciato cadere nella shell dei comandi. Certo, potrei sqlcmd e ottenere il valore di @@servername
ma se sapessi quale connessione avviare sqlcmd, non avrei bisogno di interrogare il database;)
TSQL potrebbe probabilmente funzionare se lo abilitiamo, xp_cmdshell
ma non sono sicuro che abbiano attivato la funzione del governo e possono essere persnickety su impostazioni non predefinite. Anche allora, sono bloccato a vuoto con SQL dinamico e sto perdendo molta espressività e potenza che PowerShell presta.
Mentre un po 'sgraziato, ho pensato di definire una variabile nel primo passaggio e passarla ai passaggi successivi, ma la ricerca ha rivelato questo articolo Gestione di più fasi di lavoro (BOL)
Le fasi del lavoro devono essere autosufficienti. Cioè, un lavoro non può passare valori booleani, dati o valori numerici tra i passaggi del lavoro. Tuttavia, è possibile passare valori da un passaggio del processo Transact-SQL a un altro utilizzando tabelle permanenti o tabelle temporanee globali. È possibile passare valori da passaggi di lavoro che eseguono programmi eseguibili da un passaggio di lavoro a un altro passaggio di lavoro utilizzando i file.
Non posso usare trucchi comuni come una nota impostazione di file / variabili di ambiente / registro che Foo.exe
cerca poiché ciò impedirebbe l'esecuzione simultanea tra istanze.
TL; DR:
In una fase del processo dell'agente SQL di tipo PowerShell, come è possibile determinare l'istanza di SQL Server che ha avviato il processo?