SQL 에이전트 파워 쉘 컨텍스트 참조


13

새 직장에서는 각 서버에 여러 개의 명명 된 인스턴스가 있습니다. 예 :

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

OS를 호출하는 작업에 SQL PowerShell 스크립트가 있으며 호출 Foo.exe하지만 명령 줄 매개 변수 (연결 문자열)를 전달해야합니다. 현재 인스턴스가 무엇인지 알아야하는 PowerShell 유형의 단계와 함께 SQL 에이전트 작업이 각 인스턴스에 존재합니다. 즉, 이 실행은 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-Process나는 그것을 사용할 수있는 것처럼 보이고 인스턴스를 타격하고 spids를 일치시켜 함께 물건을 모 으려고하는 부두를 사용하지만 지옥에서 피의 핵처럼 들립니다. 내가 놓친 기본이 있어야합니다. 누군가 약간의 빛을 비출 수 있습니까?

조사 된 PowerShell의 대안

다른 작업 유형을 사용하여 조사한 결과 만족스러운 해결책을 얻지 못했습니다. 연구에 따르면 SQL 에이전트 아래에 나열된 PowerShell은 SQLPS이며 에이전트를 마우스 오른쪽 버튼으로 클릭하여 인스턴스를 시작하면 자동으로 올바른 위치로 떨어졌습니다. 대화식 코드를 작업 단계에 붙여 넣은 경우에만 이전에 언급 한 차이점을 알게되었습니다.

OS의 작업 유형은 어떤 인스턴스가 명령 쉘에 빠졌는지 판별 할 수있는 방법을 찾을 수 없다는 점에서 동일한 상태로 전환되었습니다. 물론 sqlcmd를 사용하여 값을 얻을 수는 @@servername있지만 sqlcmd를 시작할 연결을 알고 있다면 데이터베이스를 쿼리 할 필요가 없습니다.)

TSQL을 사용하도록 설정하면 작동 할 수 xp_cmdshell있지만, 정부 기관이 켜져 있는지 여부는 확실하지 않으며 기본이 아닌 설정에 대해서는 당황 할 수 있습니다. 그럼에도 불구하고 나는 동적 SQL로 혼란스러워하고 PowerShell이 ​​빌려주는 표현력과 힘을 많이 잃어 버렸습니다.

조금 부득이하지만 첫 번째 단계에서 변수를 정의하고 후속 단계로 전달한다고 생각했지만 연구는이 기사를 여러 작업 단계 처리 (BOL) 처리했습니다.

작업 단계는 독립적이어야합니다. 즉, 작업은 작업 단계간에 부울 값, 데이터 또는 숫자 값을 전달할 수 없습니다. 그러나 영구 테이블 또는 전역 임시 테이블을 사용하여 한 Transact-SQL 작업 단계의 값을 다른 Transact-SQL 작업 단계로 전달할 수 있습니다. 파일을 사용하여 실행 프로그램을 실행하는 작업 단계의 값을 한 작업 단계에서 다른 작업 단계로 전달할 수 있습니다.

잘 알려진 파일 / 환경 변수 / 레지스트리 설정과 같은 일반적인 트릭을 사용할 수 없으므로 Foo.exe인스턴스 간 동시 실행을 방해합니다.

TL; DR :

PowerShell 유형의 SQL 에이전트 작업 단계에서 프로세스를 시작한 SQL Server 인스턴스를 어떻게 확인할 수 있습니까?


4
Powershell이 ​​현재 수행중인 작업의 요구 사항입니까?
johndacostaa

실제 요구 사항은 호출하는 인스턴스의 매개 변수를 사용하여 DOS 프로세스를 시작할 수있는 SQL 에이전트에 "어떤 것"이 있어야합니다. 위에 작동하지 않은 것을 감안할 때 PowerShell이 ​​가장 적합한 것처럼 보였습니다. 지각 응답으로 죄송합니다. 스카우트 캠프에있었습니다.
billinkc

답변:


9

SQL Server BOL을 살펴보면 SQL Server 에이전트는 작업 단계 명령 텍스트와 출력 파일을 대체 할 "토큰"세트를 제공합니다 (나중에 GUI "보기"단추가 작동하지 못하게 함). 이 토큰은 T-SQL을 제외한 모든 유형의 단계에서 작동하는 것 같습니다.

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

따라서 SQL 2008 PowerShell 단계가있는 경우 다음과 같이 시작할 수 있습니다.

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

기본 인스턴스 는 있지만 이름이 instance 인 경우 MACH(machine name) 및 INST(instance instance)를 대신 사용해야 할 수도 있습니다 .SRVR == MACHSRVR == MACH\INST


3

슬프게도 SQL Server 내에서 호출되는 PowerShell 스크립트로 많은 작업을 수행하지 않았습니다. 나도 컴퓨터를 가지고 놀 수 없어

PowerShell 유형 단계를 사용하는 대신 CmdExec을 사용하고 명령 줄 "powershell 'MyScript.ps1'"에서와 같이 스크립트를 호출하면 실행중인 인스턴스가있는 매개 변수를 전달할 수 있다고 생각합니다. "Powershell 'MyScript.ps1'MyInstanceName"과 같습니다.

따라서 스크립트를 시작할 때 MyInstanceName의 해당 값을 허용하도록 param () 설정이 있습니다.


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

PowerShell 스크립트가 Foo.exe를 올바르게 호출 할 수 있도록 인스턴스가 어느 인스턴스인지 알아야하는 한 단계를 시작하기 시작했습니다. 그러나 나중에 다른 단계로 값을 전달할 수 있다고 언급했습니다. 이것이 사실이라면 PowerShell 스크립트를 호출하고 필요한 다른 작업을 수행하는 작은 SSIS 패키지를 만드는 것이 좋습니다. SSIS를 사용하면 전체 패키지에서 사용할 수있는 전역 변수를 설정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.