Справочник контекста командной строки SQL Agent

На моем новом задании мы имеем несколько именованных экземпляров на каждом сервере.

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

У меня есть сценарий SQL PowerShell в работах, которые вызывают в ОС, вызывает Foo.exe, но ему необходимо передать параметр командной строки (строка подключения). Задание агента SQL будет существовать в каждом экземпляре с шагом типа PowerShell, который должен знать, что такое текущий контекст. i.e. Это исполнение началось с 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 на другой, используя постоянные таблицы или глобальные временные таблицы. один шаг задания CmdExec к другому, используя файлы ».

Я не могу использовать общие трюки, такие как хорошо известные параметры /реестр файлов /среды, которые Foo.exe ищет, поскольку это предотвратит одновременное выполнение между экземплярами.

TL; др

На шаге задания агента SQL типа PowerShell, как вы можете определить экземпляр SQL Server, который запустил этот процесс?

11 голосов | спросил billinkc 25 J0000006Europe/Moscow 2011, 02:18:04

2 ответа


7

Если вы посмотрите в SQL Server BOL, агент SQL Server предоставляет набор «токенов», которые будут заменяться как текстом команды рабочего шага, так и выходным файлом (более поздняя версия будет препятствовать работе кнопки просмотра «GUI») , Эти токены, похоже, работают для любого типа шагов, кроме T-SQL.

http://msdn.microsoft.com/en-us/library/ms175575.aspx

Итак, если у вас есть шаг PowerShell SQL 2008, вы можете запустить его с помощью:

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

Возможно, вам придется использовать MACH (имя машины) и INST (просто имя экземпляра), потому что с экземпляром SRVR == MACH по умолчанию, но с именованными экземплярами SRVR == MACH \ INST.

ответил David Lathrop 22 +04002011-10-22T01:25:31+04:00312011bEurope/MoscowSat, 22 Oct 2011 01:25:31 +0400 2011, 01:25:31
2

С грустью сказать, что я много не делал с сценариями PowerShell, вызываемыми внутри SQL Server. Я также не на компьютере, с которым я мог бы играть с ним прямо сейчас.

Я считаю, что вместо того, чтобы использовать шаг типа PowerShell, если вы использовали CmdExec и просто вызываете свой скрипт так же, как из командной строки «powershell» MyScript.ps1 », вы можете передать параметр, который имеет экземпляр, который вы бег из. Как «Powershell» MyScript.ps1 «MyInstanceName».

Итак, для начала вашего скрипта у вас есть параметр param (), чтобы принять это значение MyInstanceName:


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

Как только вы начали с того, что один шаг нужно знать, в каком экземпляре он был включен, скрипт PowerShell может правильно вызвать Foo.exe. Однако позже вы упоминаете, что можете передать значение другим шагам. Если это так, вы можете посмотреть на создание небольшого пакета SSIS, который вызывает ваш сценарий PowerShell и делает все, что вам нужно. С помощью SSIS вы можете настроить глобальную переменную, которую может использовать весь пакет.

ответил Shawn Melton 14 J000000Thursday11 2011, 23:13:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132