SQL Server代理作业:在失败时通知多个操作员

38

我在SQL Server 2008中设置了一个作业,当作业失败时向一个操作员发送通知电子邮件。

问题:能否设置将通知电子邮件发送给多个操作员以针对这个特定的作业?

我认为这个问题的一个可能的解决方法是为数据库创建许多警报,针对每个给定的严重性级别,但我希望有更简洁的方法来完成。如果我选择这种方法,哪些严重性错误可能会由于作业失败而被触发?(我认为像这样的情况不需要所有的25个)

是否可以通过SQL命令来添加更多需要在作业失败时通知的操作员?从UI中似乎只能选择一个操作员。


如果我没记错的话,你可以为每个操作者定义多个电子邮件地址,如果这对你有帮助的话? - Martin Smith
不,我有那个,但问题是在作业的通知部分只能选择一个运算符。 - Mike
是的,我认为没有办法做到你想要的。当我想要提醒多个人时,我只是设置了一个新的操作员,如果我没记错的话。[msdb].[dbo].[sysjobs]operator_id列,而不是在支持一对多的单独表中。 - Martin Smith
好的,我可以尝试一下并查看它是否有效。我第一次误读了你的评论,很抱歉。 - Mike
好的。你能提醒我一下,这是一个分号分隔的列表吗? - Martin Smith
显示剩余3条评论
7个回答

42

问题:是否可能设置一封通知邮件并将其发送给多个操作者,针对于特定的作业?

我认为这是不可能的。

[msdb].[dbo].[sysjobs]表的结构来看,各种operator_id列都在该表中,这支持了1到多不可能的想法。

但是有一些替代方法:

  1. 您可以创建一个新的 operator,并使用分号分隔的电子邮件地址列表。根据sysoperators的定义,这适用于能够适应nvarchar(100)的字符串。
  2. 如果需要超出此限制,您可能可以在 Exchange 或其他地方设置电子邮件分发组。

1
我们在工作中一直使用电子邮件组方法(Exchange分发列表),直到我们的DL安全策略在Exchange端被更改为“要求所有发件人进行身份验证”。向个人电子邮件地址发送通知仍然有效,因此这是一个方便的(希望是暂时的)解决方法。100个字符并不是很多空间。举个例子,只有3个电子邮件地址就占用了56个字符。 - Voysinmyhead
请执行以下代码以更新运算符的电子邮件地址:EXECUTE msdb.dbo.sp_update_operator @email_address = N'person1@company.org;person2@company.org'; - user8280126
@Apple 这与下面的答案相同。 "不可能" 指的是多个运算符而不是多个电子邮件地址。 - Martin Smith

35

如果您想要在工作失败时通知组织中的多个人员,您可以通过在操作员的电子邮件地址中使用分号将每个邮箱分开来实现。

我假设您要通知的操作员名为JobWatcher:

EXECUTE msdb.dbo.sp_update_operator
  @name = N'JobWatcher',
  @email_address = N'person1@company.org;person2@company.org';

现在当作业失败时,person1@company.org和person2@company.org会收到邮件。


4
虽然已经有人指出过,但这是正确的。该领域只允许100个字符,当输入多个地址时很快就会填满。 - Mark Hedley
@MarkHedley 这只是一个短期解决方案,但如果你很难在你的邮件服务器上进行组的更改,它仍然可能有用。我试图更新答案,但SO现在出错了。稍后我会再试一次。感谢您的反馈! - Iain Samuel McLean Elder
3
100字符问题的一个讨厌副产品是,它会让你输入超过100个字符,但在你点击“确定”后就会截断! - PeterX

33

我用来在 "JOB FAILURE" 时通知多个 "OPERATORS" 的最简单方法是:

SSMS>SQL Server Agent>Operators 中创建一个新的 OPERATOR编辑 现有的,并在 "E-mail name:" 框中添加以 ";" 分隔的额外电子邮件地址。


这需要更高的优先级。 - Don Cheadle
@mmcrae 或者你可以学会阅读。你刚才点踩的答案中包含了这样一行代码:你可以使用分号分隔的电子邮件地址列表创建一个新的运算符 - Martin Smith
@MartinSmith - 在我看来,这个更清晰明了(“你可以学会阅读”- 高雅!)。你的回答更专注于问题的字面查询(关于运算符),但很明显OP只是在寻找一种简单的方法来发送多个电子邮件地址... 而这就是那种简单的方法。 - Don Cheadle
由于我的电子邮件列表超过了100个字符,所以它无法正常工作。即使扩展了“email_address”列的列宽以容纳多个电子邮件地址(如果总长度> 100个字符),使用:USE msdb; ALTER TABLE sysoperators; ALTER column email_address NVARCHAR(2000); 这使得SSMS GUI无法使用,因为它不会打开“代理作业属性”下的“通知”选项卡/对话框框。我必须采用T-SQL方法(通过添加跳转到“成功/失败操作”的附加步骤)。 - Eddie Kumar

13
最佳实践是在您的邮件服务器上创建一个群组,将通知发送到该群组,然后从邮件服务器控制收件人数量。

1
这是我们工作的方式。假设您的所有管理员都是 Outlook 分发组 DBAs 的一部分。您可以创建一个名为“DBAs”的代理运算符,其电子邮件地址为“DBAs@company.org”,以通知分发组中的每个人。 - Iain Samuel McLean Elder

11

如果您的意图是让组织中的多个人员在作业失败时收到通知,而另一组多个人员在成功时收到通知,则以下是我想出的解决方法。

您会注意到步骤1-3是定期作业使用的正常任务,就像您为自己的任务所做的那样。在这些步骤之前可以有任意多个步骤,但是该过程的最后一步 (步骤3) 需要"在成功"和"在失败"时分别进入不同的电子邮件。此外,所有的“失败”都需要继续发送到下面突出显示的“失败电子邮件”。因此,失败组将收到他们的电子邮件,而作业仍将失败以供历史记录。

1.1

您将看到更改“成功操作”和“失败操作”的方向选项在作业步骤的高级选项卡中。

2

失败电子邮件步骤 - 一般属性

3

失败电子邮件步骤 - 高级属性

4

成功电子邮件步骤 - 一般属性

5

成功电子邮件步骤 - 高级属性

6

对于其他需要帮助的人。 通知多个操作员并显示不同结果


1
虽然 dbahiker 没有直接解决原问题,但我认为它被低估了(得分为-1)。这是一个可行的解决方案,可以解决 SQL Agent 运算符的限制。 - RyanB
是的,这是一个很好的解决方法(针对没有任何用处的限制)。 - Flat Cat

5
请使用以下脚本来增加电子邮件地址的字符长度。 USE mdsdb GO ALTER TABLE sysoperators ALTER COLUMN email_address NVARCHAR(2000);

谢谢你的贡献和加一。最终,没有人应该再遇到这个限制了。唯一的问题(可能)是当SQL服务器升级时。我不确定它是否会再次缩短长度,从而截断字符串,或者升级是否会失败。 - Binarus
2
即使将“email_address”列的列宽扩展以容纳多个电子邮件地址(如果总长度> 100个字符),使用以下命令:USE msdb; ALTER TABLE sysoperators; ALTER column email_address NVARCHAR(2000);,SSMS GUI也变得无用,因为它无法打开“代理作业属性”下的“通知”选项卡/对话框。 - Eddie Kumar

1

11年前有人问到了SQL Server 2008的问题。

快进到2023年,即使在SQL Server 2016中,您也可以设置单个操作员,并且在任何警报上都可以指定多个操作员。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接