새 직장에서는 각 서버에 여러 개의 명명 된 인스턴스가 있습니다. 예 :
- 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-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
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 인스턴스를 어떻게 확인할 수 있습니까?