На моїй новій роботі у нас є кілька названих екземплярів на кожному сервері. напр
- Server1 \ Dev
- Server1 \ DevIintegrated
- Server1 \ QA
У мене є сценарій SQL PowerShell в роботах, який викликає ОС, викликає, Foo.exe
але потрібно передавати параметр командного рядка (рядок з'єднання). Завдання агента SQL буде існувати в кожному екземплярі з кроком типу PowerShell, який повинен знати, що таке поточний контекст. тобто це виконання розпочалося на DevIntegrated.
У мене немає бажання починати кожен сценарій з ...
$thisInstance = "Dev"
... тим більше, що мені доведеться це редагувати, коли ми переходимо до середовищ (нових серверів та названих примірників) у наступні місяці.
Якщо я запускаю SQLPS, я можу визначити свій екземпляр, нарізавши та підкресливши результати Get-Location або запустивши
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Коли агент SQL запускає завдання типу PowerShell, він запускається в C: \ windows \ system32 і Get-Location
маршрут не працює, оскільки він не знаходиться в контексті SQLSERVER. Я можу перейти до цього контексту, але я буду в "корені" SQL Server і не знаю, в якому екземплярі я повинен бути. Використання Invoke-Sqlcmd
маршруту не працюватиме ні з тієї ж причини (технічно це виходить, як там не є примірником за замовчуванням)
Наскільки мені відомо, я перерахував усі основні "речі", які я можу потрапити в журнал роботи, але нічого, схоже, не показує SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
Здається, я міг би скористатися цим і деяким вуду, намагаючись обмотати речі, вдаряючи про екземпляри та узгоджуючи павуків, але це просто звучить як кривавий злом з пекла. Повинно бути щось основне, чого я не вистачає, може хтось пролити світло?
Досліджені альтернативи PowerShell
Я досліджував, використовуючи інші види роботи, і не отримав задовільного рішення. Дослідження показали, що PowerShell, зазначений у SQL Agent, був SQLPS, і запустити його екземпляр, натиснувши правою кнопкою миші на Агент, автоматично перекинув мене в потрібне місце. Лише коли я вставив свій інтерактивний код у крок завдання, я дізнався про різницю, про яку говорилося раніше.
Тип роботи ОС поставив мене в ідентичний стан тим, що я не міг знайти спосіб визначити, який екземпляр потрапив у командну оболонку. Звичайно, я міг sqlcmd і отримати значення, @@servername
але якби я знав, з якого з'єднання запустити sqlcmd, мені не потрібно було б запитувати базу даних;)
TSQL, ймовірно, може працювати, якщо ми включимо, xp_cmdshell
але я не впевнений, чи він увімкнено --- урядовий об'єкт, і вони можуть бути відповідальними за налаштування, що не використовуються за замовчуванням. Вже тоді я застряг у фьюзингу з динамічним SQL і втратив багато виразності та потужності, яку надає PowerShell.
Хоча трохи непогано, я думав визначити змінну на першому кроці та передати її наступним крокам, але дослідження показало цю статтю Поводження з декількома кроками роботи (BOL)
Крок роботи повинен бути самостійним. Тобто завдання не може передавати булеві значення, дані чи числові значення між етапами завдання. Однак ви можете передавати значення з одного кроку завдання Transact-SQL в інший, використовуючи постійні таблиці або глобальні тимчасові таблиці. За допомогою файлів ви можете передавати значення з кроків завдання, які запускають виконувані програми з одного кроку завдання на інший.
Я не можу використовувати поширені хитрощі, як добре відомі файлові / середовищні змінні / налаштування реєстру, які Foo.exe
шукають, оскільки це запобіжить одночасному виконанню через екземпляри.
TL; DR:
На кроці роботи SQL Agent Job типу PowerShell, як можна визначити екземпляр SQL Server, який запустив процес?