Agen SQL memperkuat referensi konteks

13

Di pekerjaan baru saya, kami memiliki beberapa instance bernama di setiap server. misalnya

  • Server1 \ Dev
  • Server1 \ DevIntegrated
  • Server1 \ QA

Saya memiliki skrip SQL PowerShell dalam karya-karya yang memanggil OS, memanggil Foo.exetetapi perlu melewati parameter baris perintah (string koneksi). Pekerjaan SQL Agent akan ada pada setiap contoh, dengan langkah tipe PowerShell, yang perlu tahu apa konteks saat ini. yaitu eksekusi ini dimulai pada DevIntegrated.

Saya tidak punya keinginan untuk memulai setiap skrip dengan ...

$thisInstance = "Dev"

... terutama karena saya harus mengeditnya ketika kami bermigrasi ke lingkungan (server baru dan instance bernama) dalam beberapa bulan mendatang.

Jika saya memulai SQLPS, saya dapat menentukan instance saya dengan mengiris dan mencoret hasil Get-Location atau menjalankan

(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName

Ketika agen SQL memulai pekerjaan bertipe PowerShell, itu dimulai di C: \ windows \ system32 dan Get-Locationrute tidak berfungsi karena tidak dalam konteks SQLSERVER. Aku bisa berubah menjadi konteks itu tapi aku akan berada di "akar" dari SQL Server dan tidak akan tahu apa misalnya aku harus di. Menggunakan Invoke-Sqlcmdrute tidak akan bekerja baik untuk alasan yang sama (secara teknis, kali keluar karena ada tidak ada instance default)

Sepengetahuan saya, saya telah menyebutkan semua "hal" dasar yang bisa saya masukkan ke dalam daftar pekerjaan tetapi tampaknya tidak ada yang menunjukkan SQLSERVER:\SQL\Server1\DevIntegrated

Get-ProcessSepertinya saya bisa menggunakan itu dan beberapa voodoo mencoba menyatukan hal-hal bersama dengan memukul contoh dan spids yang cocok tapi itu terdengar seperti hack berdarah dari neraka. Pasti ada sesuatu yang mendasar yang saya lewatkan, adakah yang bisa menjelaskan?

Alternatif untuk PowerShell diselidiki

Saya telah menyelidiki menggunakan jenis pekerjaan lain dan tidak mendapatkan resolusi yang memuaskan. Penelitian menunjukkan PowerShell yang terdaftar di bawah SQL Agent adalah SQLPS dan memulai sebuah instance dengan mengklik kanan pada Agent secara otomatis menjatuhkan saya ke lokasi yang benar. Hanya ketika saya menyisipkan kode interaktif saya ke dalam langkah pekerjaan yang saya pelajari perbedaannya seperti yang disebutkan sebelumnya.

Jenis pekerjaan OS menempatkan saya ke dalam keadaan yang identik di mana saya tidak dapat menemukan cara untuk menentukan contoh yang menjatuhkan saya ke shell perintah. Tentu, saya bisa sqlcmd dan mendapatkan nilai @@servernametetapi jika saya tahu koneksi apa untuk memulai sqlcmd, saya tidak perlu untuk query database;)

TSQL mungkin bisa berfungsi jika kita mengaktifkannya xp_cmdshelltetapi saya tidak yakin apakah mereka telah dinyalakan --- fasilitas pemerintah dan mereka dapat terus-menerus menggunakan pengaturan non-standar. Bahkan kemudian, saya terjebak futzing dengan SQL dinamis dan kehilangan banyak ekspresi dan kekuatan yang meminjamkan PowerShell.

Meskipun agak canggung, saya pikir mendefinisikan variabel pada langkah pertama dan meneruskannya ke langkah-langkah selanjutnya, tetapi penelitian menemukan artikel ini Menangani Berbagai Langkah Pekerjaan (BOL)

Langkah-langkah pekerjaan harus mandiri. Artinya, suatu pekerjaan tidak dapat melewati nilai Boolean, data, atau nilai numerik di antara langkah-langkah pekerjaan. Namun, Anda dapat meneruskan nilai dari satu langkah pekerjaan Transact-SQL ke langkah lain dengan menggunakan tabel permanen atau tabel sementara global. Anda bisa meneruskan nilai dari langkah pekerjaan yang menjalankan program yang dapat dieksekusi dari satu langkah kerja ke langkah pekerjaan lain dengan menggunakan file.

Saya tidak bisa menggunakan trik umum seperti pengaturan file / variabel lingkungan / registri yang terkenal yang Foo.exedicari karena itu akan mencegah eksekusi bersamaan di seluruh instance.

TL; DR:

Dalam langkah Pekerjaan Agen SQL dari tipe PowerShell, bagaimana Anda bisa menentukan contoh SQL Server yang meluncurkan proses?

billinkc
sumber
4
Apakah powershell persyaratan untuk apa yang Anda lakukan?
johndacostaa
Persyaratan sebenarnya adalah memiliki "sesuatu" yang dapat di-reuasble dalam agen SQL yang dapat meluncurkan proses DOS dengan parameter dari instance yang dipanggil. PowerShell tampak paling cocok mengingat apa yang tidak berhasil di atas. Maaf atas tanggapan yang terlambat, saya keluar di perkemahan Pramuka.
billinkc

Jawaban:

9

Jika Anda melihat dalam SQL Server BOL, SQL Server Agent menyediakan satu set "token" yang akan menggantikan teks perintah langkah kerja dan file output (nanti akan mencegah tombol "tampilan" GUI bekerja). Token ini tampaknya berfungsi untuk semua jenis langkah kecuali T-SQL.

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

Jadi, jika Anda memiliki langkah SQL 2008 PowerShell, Anda bisa memulainya dengan:

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

Anda mungkin perlu menggunakan MACH(nama mesin) dan INST(hanya nama instance) sebagai gantinya, karena dengan instance default SRVR == MACH, tetapi dengan instance bernama SRVR == MACH\INST.

David Lathrop
sumber
3

Sedih untuk mengatakan saya belum melakukan banyak dengan skrip PowerShell dipanggil di dalam SQL Server. Saya juga tidak di komputer yang bisa saya mainkan sekarang.

Saya percaya meskipun alih-alih menggunakan langkah tipe PowerShell bahwa jika Anda menggunakan CmdExec dan hanya memanggil skrip Anda seperti yang Anda lakukan dari baris perintah "powershell 'MyScript.ps1'" Anda kemudian dapat melewati parameter yang memiliki instance yang Anda jalankan. Seperti "Powershell 'MyScript.ps1' MyInstanceName".

Jadi awal skrip Anda, Anda memiliki pengaturan param () untuk menerima nilai MyInstanceName itu:


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

Ketika Anda mulai menyatakan satu langkah yang diperlukan untuk mengetahui instance apa itu sehingga skrip PowerShell dapat memanggil Foo.exe dengan benar. Namun, nanti Anda menyebutkan bisa meneruskan nilai ke langkah lain. Jika ini benar, Anda mungkin ingin melihat membuat paket SSIS kecil yang memanggil skrip PowerShell Anda dan melakukan apa pun yang Anda butuhkan. Dengan SSIS Anda dapat mengatur variabel global yang dapat digunakan seluruh paket.


sumber