다음을 통해 공유


작업 단계에서 토큰 사용

적용 대상:SQL ServerAzure SQL Managed Instance

중요합니다

Azure SQL Managed Instance에서는 현재 대부분의 SQL Server 에이전트 기능이 지원되지만, 모든 기능이 지원되는 것은 아닙니다. 자세한 내용은 Azure SQL Managed Instance의 T-SQL과 SQL Server의 차이점 또는 SQL Managed Instance의 SQL 에이전트 작업 제한을 참조하세요.

SQL Server 에이전트를 사용하면 Transact-SQL 작업 단계 스크립트에서 토큰을 사용할 수 있습니다. 작업 단계를 작성할 때 토큰을 사용하면 소프트웨어 프로그램을 작성할 때 변수가 제공하는 것과 동일한 유연성을 제공합니다. 작업 단계 스크립트에 토큰을 삽입한 후 SQL Server 에이전트는 Transact-SQL 하위 시스템에 의해 작업 단계가 실행되기 전에 런타임에 토큰을 바꿉니다.

토큰 사용 이해

Windows 이벤트 로그에 대한 쓰기 권한이 있는 모든 Windows 사용자는 SQL Server 에이전트 경고 또는 WMI 경고에 의해 활성화되는 작업 단계에 액세스할 수 있습니다. 이 보안 위험을 방지하기 위해 경고에 의해 활성화된 작업에 사용할 수 있는 SQL Server 에이전트 토큰은 기본적으로 비활성화됩니다. 이러한 토큰은 다음과 같습니다: A-DBN, A-SVR, A-ERR, A-SEV, A-MSG, 그리고 WMI(<property>). 이 릴리스에서는 토큰 사용이 모든 경고로 확장됩니다.

중요합니다

이러한 토큰을 사용해야 하는 경우 먼저 관리자 그룹과 같은 신뢰할 수 있는 Windows 보안 그룹의 멤버만 SQL Server가 있는 컴퓨터의 이벤트 로그에 대한 쓰기 권한이 있는지 확인합니다. 그런 다음 개체 탐색기에서 SQL Server 에이전트 를 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 경고 시스템 페이지에서 경고에 대한 모든 작업 응답에 대한 토큰 바꾸기 를 선택하여 이러한 토큰을 사용하도록 설정합니다.

SQL Server 에이전트 토큰 교체는 간단하고 효율적입니다. SQL Server 에이전트는 토큰에 대한 정확한 리터럴 문자열 값을 대체합니다. 모든 토큰은 대/소문자를 구분합니다. 작업 단계에서는 이를 고려하여 사용하는 토큰을 올바르게 인용하거나 대체 문자열을 올바른 데이터 형식으로 변환해야 합니다.

예를 들어 다음 문을 사용하여 작업 단계에서 데이터베이스의 이름을 인쇄할 수 있습니다.

PRINT N'Current database name is $(ESCAPE_SQUOTE(A-DBN))';

이 예제에서는 매크로가 ESCAPE_SQUOTE 토큰과 함께 A-DBN 삽입됩니다. 런타임에 토큰이 A-DBN 적절한 데이터베이스 이름으로 바뀝다. 이스케이프 매크로는 토큰 대체 문자열에 실수로 전달될 수 있는 작은따옴표를 이스케이프합니다. SQL Server 에이전트는 하나의 작은따옴표를 마지막 문자열의 작은따옴표로 바꿉니다.

예를 들어 토큰을 바꾸기 위해 전달된 문자열이 AdventureWorks2022'SELECT @@VERSION --있으면 SQL Server 에이전트 작업 단계에서 실행하는 명령은 다음과 같습니다.

PRINT N'Current database name is AdventureWorks2022''SELECT @@VERSION --';

이 경우 삽입된 문은 SELECT @@VERSION실행되지 않습니다. 대신 추가 작은따옴표로 인해 서버는 삽입된 문을 문자열로 구문 분석합니다. 토큰 대체 문자열에 작은따옴표가 없으면 문자가 이스케이프되지 않고 토큰을 포함하는 작업 단계가 의도한 대로 실행됩니다.

작업 단계에서 토큰 사용량을 디버그하려면 작업 단계 출력과 같은 PRINT N'$(ESCAPE_SQUOTE(SQLDIR))' 인쇄 문을 사용하고 파일 또는 테이블에 저장합니다. 작업 단계 속성 대화 상자의 고급 페이지를 사용하여 작업 단계 출력 파일 또는 테이블을 지정할 수 있습니다.

SQL Server 에이전트 토큰 및 매크로

다음 표에서는 SQL Server 에이전트가 지원하는 토큰 및 매크로를 나열하고 설명합니다.

SQL Server 에이전트 토큰

토큰 설명
(A-DBN) 데이터베이스 이름입니다. 작업이 경고에 의해 실행되는 경우 데이터베이스 이름 값은 작업 단계에서 이 토큰을 자동으로 바꿉니다.
(A-SVR) 서버 이름입니다. 작업이 경고에 의해 실행되는 경우 서버 이름 값은 작업 단계에서 이 토큰을 자동으로 바꿉니다.
(A-ERR) 오류 번호입니다. 작업이 경고에 의해 실행되는 경우 오류 번호 값은 작업 단계에서 이 토큰을 자동으로 바꿉니다.
(A-SEV) 오류 심각도입니다. 작업이 경고에 의해 실행되는 경우 오류 심각도 값은 작업 단계에서 이 토큰을 자동으로 바꿉니다.
(A-MSG) 메시지 텍스트입니다. 작업이 경고에 의해 실행되는 경우 메시지 텍스트 값은 작업 단계에서 이 토큰을 자동으로 바꿉니다.
(JOBNAME) 작업의 이름입니다. 이 토큰은 SQL Server 2016 이상에서만 사용할 수 있습니다.
(STEPNAME) 단계의 이름입니다. 이 토큰은 SQL Server 2016 이상에서만 사용할 수 있습니다.
(DATE) 현재 날짜( yyyyMMdd 형식)입니다.
(INST) 인스턴스 이름 기본 인스턴스의 경우 이 토큰에는 기본 인스턴스 이름이 있습니다 MSSQLSERVER.
(JOBID) 작업 ID입니다.
(MACH) 컴퓨터 이름입니다.
(MSSA) 마스터 SQL Server 에이전트 서비스 이름입니다.
(OSCMD) CmdExec 작업 단계를 실행하는 데 사용되는 프로그램의 접두사입니다.
(SQLDIR) SQL Server가 설치된 디렉터리입니다. 이 값은 기본적으로 C:\Program Files\Microsoft SQL Server\MSSQL입니다.
(SQLLOGDIR) SQL Server 오류 로그 폴더 경로에 대한 대체 토큰(예: $(ESCAPE_SQUOTE(SQLLOGDIR)). 적용 대상: SQL Server 2014(12.x) 이상 버전
(STEPCT) 이 단계가 실행된 횟수(재시도 제외)입니다. 단계 명령에서 다중 단계 루프를 강제로 종료하는 데 사용할 수 있습니다.
(STEPID) 단계 ID
(SRVR) SQL Server를 실행하는 컴퓨터의 이름입니다. SQL Server 인스턴스가 명명된 인스턴스인 경우 인스턴스 이름이 포함됩니다.
(TIME) 현재 시간( HHmmss 형식)입니다.
(STRTTM) 작업이 실행되기 시작한 시간( HHmmss 형식)입니다.
(STRTDT) 작업이 실행되기 시작한 날짜( yyyyMMdd 형식)입니다.
(WMI(<property>)) WMI 경고에 대한 응답으로 실행되는 작업의 경우 지정한 속성 <property>의 값입니다. 예를 들어 $(WMI(DatabaseName)) 경고를 실행한 WMI 이벤트에 대한 속성 값을 DatabaseName 제공합니다.

SQL Server 에이전트 이스케이프 매크로

이스케이프 매크로 설명
$(ESCAPE_SQUOTE(<token_name>)) 토큰 대체 문자열에서 작은따옴표(')를 이스케이프합니다. 작은따옴표 하나를 작은따옴표 2개로 대체합니다.
$(ESCAPE_DQUOTE(<token_name>)) 토큰 대체 문자열에서 큰따옴표(")를 이스케이프합니다. 큰따옴표 하나를 두 개의 큰따옴표로 대체합니다.
$(ESCAPE_RBRACKET(<token_name>)) 토큰 대체 문자열에서 오른쪽 대괄호(])를 이스케이프합니다. 오른쪽 대괄호 하나를 두 개의 오른쪽 대괄호로 바꿉니다.
$(ESCAPE_NONE(<token_name>)) 문자열에서 문자를 이스케이프하지 않고 토큰을 바꿉니다. 이 매크로는 토큰 대체 문자열이 신뢰할 수 있는 사용자에게서만 제공되는 환경에서 호환성을 유지하기 위해 제공됩니다. 자세한 내용은 매크로를 사용하도록 작업 단계 업데이트 섹션을 참조하세요.

매크로를 사용하도록 작업 단계 업데이트

다음 표에서는 SQL Server 에이전트에서 토큰 교체를 처리하는 방법을 설명합니다. 경고 토큰 교체를 설정하거나 해제하려면 개체 탐색기에서 SQL Server 에이전트 를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 경고 시스템 페이지에서 경고대한 모든 작업 응답에 대한 토큰 바꾸기 확인란을 선택하거나 선택 취소합니다.

토큰 구문 경고 토큰 교체 켜기 경고 토큰 교체 해제
ESCAPE 사용된 매크로 작업의 모든 토큰이 성공적으로 대체됩니다. 경고에 의해 활성화된 토큰은 대체되지 않습니다. 이러한 토큰은 A-DBN,A-SVR, A-ERR, A-SEVA-MSGWMI(<property>). 다른 정적 토큰이 성공적으로 대체됩니다.
ESCAPE 매크로 사용 안 됨 토큰을 포함하는 모든 작업이 실패합니다. 토큰을 포함하는 모든 작업이 실패합니다.

토큰 구문 업데이트 예제

다음은 이러한 명령을 사용하는 방법을 설명하는 데 도움이 되는 토큰 구문 예제입니다.

A. 중첩되지 않은 문자열에서 토큰 사용

다음 예제에서는 적절한 이스케이프 매크로를 사용하여 중첩되지 않은 기본 스크립트를 업데이트하는 방법을 보여 있습니다. 업데이트 스크립트를 실행하기 전에 다음 작업 단계 스크립트는 작업 단계 토큰을 사용하여 적절한 데이터베이스 이름을 인쇄합니다.

PRINT N'Current database name is $(A-DBN)';

업데이트 스크립트를 실행한 후 ESCAPE_NONE 토큰 앞에 A-DBN 매크로가 삽입됩니다. 작은따옴표는 인쇄 문자열을 구분하는 데 사용되므로 다음과 같이 매크로를 삽입하여 ESCAPE_SQUOTE 작업 단계를 업데이트해야 합니다.

PRINT N'Current database name is $(ESCAPE_SQUOTE(A-DBN))';

B. 중첩된 문자열에서 토큰 사용

중첩된 문자열 또는 문에 토큰이 사용되는 작업 단계 스크립트에서는 적절한 이스케이프 매크로를 삽입하기 전에 중첩된 문을 여러 문으로 다시 작성해야 합니다.

예를 들어, A-MSG 토큰을 사용하는데 이스케이프 매크로로 업데이트되지 않은 다음의 작업 단계를 고려해 보십시오.

PRINT N'Print ''$(A-MSG)''';

업데이트 스크립트를 실행한 후 ESCAPE_NONE 매크로가 토큰과 함께 삽입됩니다. 그러나 이 경우 중첩을 사용하지 않고 스크립트를 다음과 같이 다시 작성하되, 토큰 대체 문자열에 전달될 수 있는 구분 기호를 제대로 이스케이프하기 위해 ESCAPE_SQUOTE 매크로를 삽입해야 합니다.

DECLARE @msgString AS NVARCHAR (MAX);
SET @msgString = '$(ESCAPE_SQUOTE(A-MSG))';
SET @msgString = QUOTENAME(@msgString, '''');
PRINT N'Print ' + @msgString;

이 예제에서 함수는 QUOTENAME 따옴표 문자를 설정합니다.

C. ESCAPE_NONE 매크로와 함께 토큰 사용

다음 스크립트는 sysjobs 테이블에서 job_id를 검색하여 JOBID 토큰을 사용해 앞서 이진 데이터 형식으로 선언된 @JobID 변수를 채우는 일부입니다.

비고

이진 데이터 형식 ESCAPE_NONE 에는 구분 기호가 필요하지 않으므로 매크로는 토큰과 함께 JOBID 사용됩니다. 업데이트 스크립트를 실행한 후에는 이 작업 단계를 업데이트할 필요가 없습니다.

DECLARE @JobID UNIQUEIDENTIFIER;
SET @JobID = $(ESCAPE_NONE(JOBID));

이렇게 하면 JOBID 토큰의 값을 @JobID에 직접 할당하여, 불필요한 데이터베이스 쿼리와 형 변환을 제거하고 C 섹션에서 제기된 문제를 해결합니다.