SQL Agent powershell bağlam başvurusu


13

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.exeama 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-Locationyol, 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-SqlcmdRotayı 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-ProcessBunu 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 @@servernameama sqlcmd başlatmak için hangi bağlantı biliyordu, ben veritabanını sorgulamak gerekmez;)

TSQL, etkinleştirirsek muhtemelen işe yarayabilir, xp_cmdshellancak 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?


4
Powershell yaptığınız şey için bir gereklilik mi?
johndacostaa

Gerçek gereksinim, SQL aracısında çağıran örneğin bir parametresi ile bir DOS işlemi başlatabilecek bir "reuasble" şey olacaktır. PowerShell, yukarıda işe yaramayanlar göz önüne alındığında en uygun görünüyordu. Gecikmeli yanıt için özür dilerim, Scout kampındaydım.
billinkc

Yanıtlar:


9

SQL Server BOL'a bakarsanız, SQL Server Agent hem iş adımı komut metninin hem de çıktı dosyasının yerine geçecek bir dizi "belirteç" sağlar (daha sonra GUI "görünümü" düğmesinin çalışmasını önler). Bu belirteçler, T-SQL dışındaki herhangi bir adım için çalışıyor gibi görünüyor.

https://docs.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps#sql-server-agent-tokens

Yani, bir SQL 2008 PowerShell adımınız varsa, aşağıdakilerle başlayabilirsiniz:

$sqlInstance = "$(ESCAPE_DQUOTE(SRVR))"

Bunun yerine MACH(makine adı) ve INST(sadece örnek adı) kullanmanız gerekebilir , çünkü varsayılan örnekle SRVR == MACH, ancak adlandırılmış örneklerle SRVR == MACH\INST.


3

Üzgünüm ben SQL Server içinde çağrılıyor PowerShell komut dosyaları ile pek yapmadım. Ben de şu an onunla oynayabileceğim bir bilgisayarda değilim.

CmdExec kullandıysanız ve komut dosyanızı "powershell 'MyScript.ps1'" gibi bir komut satırından alacağınız gibi PowerShell türü adımı kullanmak yerine, daha sonra çalıştırdığınız örneğe sahip bir parametreyi geçirebileceğine inanıyorum. "Powershell 'MyScript.ps1' MyInstanceName" gibi.

Komut dosyanızın başlangıcında MyInstanceName'in değerini kabul etmek için bir param () kurulumunuz var:


param(
   [Parameter(Position=0,Mandatory=$True)]
   [string]$InstanceName
)
#so if I wanted to use sqlcmd
sqlcmd -S $InstanceName -Q "SELECT @@VERSION"

Başlarken, PowerShell betiğinin Foo.exe'yi doğru şekilde çağırabilmesi için hangi örneğin üzerinde olduğunu bilmek için gereken bir adımı belirtmeye başladınız. Ancak, daha sonra değeri diğer adımlara geçirebildiğinizden bahsedersiniz. Bu doğruysa, PowerShell betiğinizi çağıran ve ihtiyacınız olan her şeyi yapan küçük bir SSIS paketi oluşturmaya bakmak isteyebilirsiniz. SSIS ile, tüm paketin kullanabileceği global bir değişken oluşturabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.