Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
применимо к:SQL Server
Управляемому экземпляру SQL Azure
Это важно
В Azure SQL Managed Instanceв настоящее время поддерживается большинство функций агента SQL Server, но не все. Дополнительные сведения см. в разделе отличия Управляемого экземпляра SQL Azure от SQL Server или ограничения заданий SQL Agent в Управляемом экземпляре SQL.
Агент SQL Server позволяет использовать токены в скриптах шагов задания Transact-SQL. Использование маркеров при написании шагов задания обеспечивает ту же гибкость, что и переменные при написании программ. После вставки маркера в скрипт шага задания SQL Server Agent заменяет маркер в процессе выполнения, перед тем как подсистема 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) |
Идентификатор задания. |
(MACH) |
Имя компьютера. |
(MSSA) |
Имя службы агента SQL Server Master. |
(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) |
Идентификатор шага. |
(SRVR) |
Имя компьютера под управлением SQL Server. Если экземпляр SQL Server является именованным экземпляром, это включает имя экземпляра. |
(TIME) |
Текущее время (в HHmmss формате). |
(STRTTM) |
Время (в HHmmss формате), когда задание начало выполняться. |
(STRTDT) |
Дата (в yyyyMMdd формате), когда начало выполняться задание. |
(WMI(<property>)) |
Для заданий, выполняемых в ответ на оповещения WMI, значение свойства, указанного в параметре <property> . Например, $(WMI(DatabaseName)) предоставляет значение DatabaseName свойства для события WMI, вызвавшего запуск оповещения. |
Макросы экранирования агента SQL Server
Экранирование макросов | Описание |
---|---|
$(ESCAPE_SQUOTE(<token_name>)) |
Экранирует одинарные кавычки (' ) в строке замены токена. Заменяет одну одинарную кавычку двумя одинарными кавычками. |
$(ESCAPE_DQUOTE(<token_name>)) |
Экранирует двойные кавычки (" ) в строке замены маркера. Заменяет одну двойную кавычку двумя двойными кавычками. |
$(ESCAPE_RBRACKET(<token_name>)) |
Экранирует правые скобки (] ) в строке для замены токенов. Заменяет одну правую скобку двумя правыми скобками. |
$(ESCAPE_NONE(<token_name>)) |
Заменяет токен без экранирования символов в строке текста. Этот макрос предоставляется для поддержки обратной совместимости в средах, где строки замены маркеров ожидаются только от доверенных пользователей. Дополнительные сведения см. в следующем разделе Обновление этапов задания для использования макросов. |
Обновите шаги задания для использования макросов
В следующей таблице описывается, как выполняется замена маркеров агентом SQL Server. Чтобы включить или отключить замену токенов в оповещениях, щелкните правой кнопкой мыши на агенте SQL Server в обозревателе объектов, выберите Свойства, а затем на странице Система оповещений установите или снимите флажок Замена токенов для всех ответов заданий на оповещения.
Синтаксис маркера | Замена токена оповещения | Отключение замены токена оповещения |
---|---|---|
ESCAPE используемый макрос |
Все токены в заданиях успешно заменены. | Маркеры, активированные оповещениями, не заменяются. Эти маркеры: A-DBN , A-SVR , A-ERR , A-SEV , A-MSG , и WMI(<property>) . Другие статические маркеры успешно заменены. |
Не используется макрос ESCAPE | Все задания, содержащие маркеры, завершаются сбоем. | Все задания, содержащие маркеры, завершаются сбоем. |
Примеры обновления синтаксиса токенов
Ниже приведены примеры синтаксиса маркеров, которые помогут проиллюстрировать использование этих команд.
А. Использование маркеров в невложенных строках
В следующем примере показано, как обновить базовый невложенный скрипт с использованием соответствующего макроса для экранирования. Перед запуском скрипта обновления следующий сценарий шага задания использует маркер шага задания для печати соответствующего имени базы данных:
PRINT N'Current database name is $(A-DBN)';
После запуска скрипта обновления, макрос ESCAPE_NONE
вставляется перед маркером A-DBN
. Поскольку для ограничения строки печати используются одиночные кавычки, необходимо обновить шаг задания, вставив макрос ESCAPE_SQUOTE
следующим образом:
PRINT N'Current database name is $(ESCAPE_SQUOTE(A-DBN))';
В. Использование маркеров в вложенных строках
В сценариях шагов задания, где маркеры используются во вложенных строках или инструкциях, вложенные инструкции должны быть переписаны как несколько инструкций перед вставкой соответствующих макросов экранирования.
Например, рассмотрим следующий шаг задания, который использует маркер 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
функция задает символ кавычки.
С. Использование маркеров с макросом ESCAPE_NONE
Следующий пример является частью скрипта, который извлекает job_id из таблицы sysjobs и использует JOBID
маркер для заполнения @JobID переменной, которая была объявлена ранее в скрипте как двоичный тип данных.
Примечание.
Так как для двоичных типов данных не требуются разделители, ESCAPE_NONE
макрос используется с маркером JOBID
. После запуска скрипта обновления не потребуется обновить этот шаг задания.
DECLARE @JobID UNIQUEIDENTIFIER;
SET @JobID = $(ESCAPE_NONE(JOBID));
Это напрямую присваивает значение из токена JOBID
к @JobID
, устраняя ненужные запросы базы данных и неявные преобразования, решая проблемы, поднятые в разделе C.