Блок захвата для триггера вставки не запускается при ошибке запуска задания SSA - PullRequest
0 голосов
/ 05 февраля 2019

Я устанавливаю триггер AFTER INSERT для запуска задания SSA, которое выполняет пакет служб SSIS, чтобы сообщить о файле журнала ETL после завершения процесса.Синтаксис для блока TRY ... CATCH выглядит правильным, но обработка кода ошибки не работает для кода ошибки, когда он обнаруживает, что задание SSA, которое ему предписано запустить, уже запущено.

Триггер для пользователятаблица в экземпляре SQL Server 2012 SP4 (с совместимостью с SQL 2012 (110)).Я попытался обработать одну ошибку (# 22022) для задания SQL, уже запущенного, но кажется, что вы не можете перехватить ошибку при выполнении системной хранимой процедуры.

CREATE TRIGGER InterfaceSupport.trg_XMLTrigger_Insert 
  ON  [InterfaceSupport].[XMLLogReaderTriggers]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        EXEC msdb.dbo.sp_start_job 'Launch job'
    END TRY
    BEGIN CATCH
        IF ERROR_NUMBER()=22022 --Job already running
            EXEC msdb.dbo.sp_send_dbmail     NULL,'name@domain.org',NULL,NULL,'Interface XML Log Reader Already     Running','The SSA Job reading Interface logs is already running. The job will     attempt to catch the new request at the end of the current cycle.'
        ELSE
            BEGIN
                DECLARE @Errormsg nvarchar(max)
                SELECT @Errormsg=ERROR_MESSAGE()
                EXEC msdb.dbo.sp_send_dbmail     NULL,'name@domain.org',NULL,NULL,'Interface XML Log Reader Spawn     Error',@Errormsg
            END
    END CATCH
END
GO

Я получаю следующую ошибкунесмотря на блок обработки ошибок.Это как если бы блок CATCH не существовал.

Msg 22022, LeveSQLServerAgent Error: Request to run job Launch Job (from User xxx) refused because the job is already running from a request by User xxx. l 16, State 1, Line 17

1 Ответ

0 голосов
/ 05 февраля 2019

К сожалению, эта ошибка не может быть замечена TRY/CATCH.

Вы должны проверять, запущено ли задание, и запускать его, только если это не так, хотя задание может начаться между проверкой и * 1004.* заявление.

DECLARE @JobID UNIQUEIDENTIFIER = (SELECT job_id FROM msdb.dbo.sysjobs AS J WHERE J.name = 'Launch job')

IF NOT EXISTS (
    SELECT
        'job is running'
    FROM 
        msdb.dbo.sysjobactivity ja 
        INNER JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
    WHERE 
        ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) AND 
        ja.start_execution_date is not null AND 
        ja.stop_execution_date is null AND
        ja.job_id = @JobID
    )
BEGIN
     EXEC msdb.dbo.sp_start_job @job_name = 'Launch job'
END
ELSE
BEGIN
    EXEC msdb.dbo.sp_send_dbmail     NULL,'name@domain.org',NULL,NULL,'Interface XML Log Reader Already     Running','The SSA Job reading Interface logs is already running. The job will     attempt to catch the new request at the end of the current cycle.'
END
...