Yeni işimde, her sunucuda birden fazla adlandırılmış örneğimiz var. Örneğin
- Server1 \ Dev
- Server1 \ DevIntegrated
- Server1 \ QA
Ben OS çağırır, çağırır Foo.exe
ama bir komut satırı parametresi (bağlantı dizesi) geçmek gerekir çalışır bir SQL PowerShell komut dosyası var . Her örnekte, geçerli bağlamın ne olduğunu bilmesi gereken PowerShell türünde bir adımla bir SQL Agent işi bulunacaktır. yani bu uygulama DevIntegrated'da başladı.
Her senaryo ile başlamak istemiyorum ...
$thisInstance = "Dev"
... özellikle önümüzdeki aylarda ortamlara (yeni sunucular ve adlandırılmış örnekler) taşındığımızda bunu düzenlemek zorunda olduğumdan beri.
SQLPS'yi başlatırsam, Get-Location sonuçlarını dilimleyerek ve doğrayarak veya çalıştırarak örneğimi belirleyebilirim
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
SQL Agent, PowerShell türünde bir iş başlattığında, C: \ windows \ system32'de başlar ve Get-Location
yol, SQLSERVER bağlamında olmadığı için çalışmaz. Bu bağlamda değişebilir ama SQL Server "kök" olacak ve hangi örnek içinde olması gerektiğini bilmiyorum. Invoke-Sqlcmd
Rotayı kullanarak aynı nedenle (teknik olarak, orada zaman aşımına uğramaz) varsayılan bir örnek değildir)
Bildiğim kadarıyla, iş günlüğüne girebileceğim tüm temel "şeyleri" numaralandırdım ama hiçbir şey görünmüyor SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
Bunu ve örneklere vurarak ve örümcekleri eşleştirerek bir şeyler toparlamaya çalışmak için bazı vuduları kullanabilirim ama bu cehennemden kanlı bir saldırı gibi geliyor. Eksik olduğum temel bir şey olmalı, kimse biraz ışık tutabilir mi?
Araştırılan PowerShell alternatifleri
Diğer iş türlerini kullanarak araştırdım ve tatmin edici bir çözüm bulamadım. Araştırmalar, SQL Agent altında listelenen PowerShell'in SQLPS olduğunu ve Agent'ı sağ tıklatarak bunun bir örneğini başlattığını ve beni otomatik olarak doğru konuma bıraktığını gösterdi. Sadece etkileşimli kodumu iş adımına yapıştırdığımda, farkın daha önce de belirtildiği gibi öğrendim.
İşletim sistemi türü beni hangi duruma koyduğumu belirlemenin bir yolu bulamadığım için beni aynı duruma soktu. Tabii, ben sqlcmd ve değerini almak @@servername
ama sqlcmd başlatmak için hangi bağlantı biliyordu, ben veritabanını sorgulamak gerekmez;)
TSQL, etkinleştirirsek muhtemelen işe yarayabilir, xp_cmdshell
ancak açık olduklarından emin değilim --- hükümet tesisi ve varsayılan olmayan ayarlarda persnickety olabilirler. O zaman bile, dinamik SQL ile uğraştım ve PowerShell'in verdiği ifade ve gücü çok kaybettim.
Biraz hantalken, ilk adımda bir değişken tanımlamayı ve bunu ardıl adımlara aktarmayı düşündüm, ancak araştırma bu makaleyi ortaya koydu Birden Fazla İş Adımını Kullanma (BOL)
İş adımları müstakil olmalıdır. Yani bir iş, iş adımları arasında Boole değerlerini, verileri veya sayısal değerleri geçiremez. Ancak kalıcı tablolar veya genel geçici tablolar kullanarak değerleri bir Transact-SQL iş adımından diğerine geçirebilirsiniz. Yürütülebilir programları çalıştıran iş adımlarındaki değerleri, dosyaları kullanarak bir iş adımından başka bir iş adımına geçirebilirsiniz.
Foo.exe
Örnekler arasında eşzamanlı yürütmeyi engelleyeceği için iyi bilinen bir dosya / ortam değişkenleri / kayıt defteri ayarı gibi yaygın hileleri kullanamıyorum .
TL; DR:
PowerShell türündeki bir SQL Aracısı İşi adımında, işlemi başlatan SQL Server örneğini nasıl belirleyebilirsiniz?