我正在设置一个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
答案 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