插入触发器的捕获块未因启动SSA作业错误而触发

时间:2019-02-05 16:21:01

标签: tsql jobs

我正在设置一个AFTER INSERT触发器来启动SSA作业,该作业将执行SSIS程序包,以在其处理完成后报告ETL日志文件。 TRY ... CATCH块的语法看起来正确,但是当它检测到被告知要启动的SSA作业已经在运行时,错误代码的错误处理不起作用。

触发器是针对SQL Server 2012 SP4实例中的用户表的(具有SQL 2012(110)兼容性)。我尝试为已经运行的SQL作业处理一个错误(#22022),但看来您无法错误捕获系统存储过程的执行。

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 :(得分:0)

很遗憾,TRY/CATCH无法捕获此错误。

尽管作业可能在检查和EXEC语句之间开始,但您应该检查作业是否正在运行并仅在未运行时开始。

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