为SQL批处理作业失败创建整合的电子邮件警报

时间:2016-10-19 14:03:02

标签: sql-server email ssms

所以这是场景。在我的一个主要SSMS盒子上,我有大约100个复制批处理作业。这些批处理作业将一系列静态数据从“主”DB复制到每个单独的DB。因此,每个DB都有一个批处理作业。创建新数据库时,将创建新的批处理作业。

批处理作业遵循命名约定,下面是一个示例

PG-APP03-ORIGINS_Master-PG-APP03-100

因此我们可以看到服务器是PG-APP03并且它是ORIGINS_Master数据库,但是其余的作业名称并没有让我看到数据库受到影响。如果我深入研究这项工作的步骤,我会看到以下内容

-Subscriber [PG-APP03] -SubscriberDB [ORIGINS_9107L1] 
-Publisher [PG-APP03]  
-Distributor [PG-APP03] 
-DistributorSecurityMode 1 
-PublisherDB [ORIGINS_Master]   

因此,我可以看到“订阅者”是我认识的数据库名称。

然而,我偶尔会有20个这样的工作在早上失败。我禁用了各个电子邮件警报,因为这些工作名称无法识别。因此,每天早上我进来,查看作业失败,并且必须深入到每个作业的第2步以找到订阅者名称。

我正在寻找可以将所有故障整理在一起的方法,由订阅者识别它们,并通过一封电子邮件发送给我。

我不仅可以使用它来更快地修复问题,我还可以将该电子邮件发送给某些关键人员,作为在复制修复之前数据库不准确的通知。

我一直在数据库中的某些表路由,并且可以找到作业存在的地方,我可以看到这些步骤,但我真的很难将这些全部放在一起。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是我写的代码,它给了我所需的输出

USE MSDB
GO

DECLARE @time INT
SET @time = cast(convert(varchar(8), getdate(), 112) as int)

SELECT DISTINCT 
   a.Name,
   b.server,
   CASE WHEN c.step_name ='Run Agent.' THEN 'Replication' END AS 'Step Name',
   CASE WHEN c.run_status ='0' THEN 'Failed' END AS 'Run Status',
   c.run_date,
   CASE WHEN b.subsystem ='Distribution' THEN SUBSTRING(b.command,38,15)
   ELSE '' END AS 'Subscriber'
FROM sysjobs AS a
INNER JOIN sysjobsteps AS b
ON a.job_id = b.job_id
INNER JOIN sysjobhistory AS c
ON a.job_id=c.job_id
WHERE c.run_status ='0'
AND c.step_id ='2'
AND c.run_date = @time
AND b.subsystem = 'Distribution'

所以我有订阅者专栏,在那里我将能够找出有问题的Db有复制问题

Result