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

Posted

技术标签:

【中文标题】SQL Server 代理作业在失败时通知多个操作员【英文标题】:SQL Server Agent Job Notify multiple operators on failure 【发布时间】:2011-11-17 21:31:16 【问题描述】:

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

问题:是否可以为该特定工作设置发送给多个操作员的通知电子邮件?

我相信一个可能的解决方法是为每个给定的严重性为数据库创建大量警报,但我希望有一种更简洁的方法来做到这一点。如果我走这条路,失败的作业可能会触发什么严重错误? (我认为我不需要所有 25 个这样的东西)

这可以通过sql命令添加更多操作符来通知失败吗?通过 UI,您似乎只能选择一个运算符。

【问题讨论】:

IIRC 如果对您有好处,您可以定义具有多个电子邮件地址的单个操作员? 不,我有,但问题是您只能在作业的通知部分选择一个操作员 是的,我不认为有办法做你想做的事。当我想提醒多个人时,我记得我刚刚设置了一个新的操作员。 [msdb].[dbo].[sysjobs] 具有 operator_id 的列,而不是位于支持一对多的单独表中。 好的,我可以试试看是否有效,我第一次看错你的评论很抱歉 我不知道您可以添加多个地址,这是一个如此简单的解决方案,谢谢!如果您将其写为答案,我可以将其标记为已回答 【参考方案1】:

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

【讨论】:

感谢您的一加一。最后,没有人应该再遇到这种限制。唯一(可能)是升级 SQL Server 时。我不确定它是否会再次减少长度,从而切断字符串,即使升级失败。 即使在扩展 'email_address' 列的列宽以能够容纳多个电子邮件地址(如果总长度 > 100 个字符)之后,使用:USE msdb; ALTER TABLE 系统操作员; ALTER 列 email_address NVARCHAR(2000);这使得 SSMS GUI 无用,因为它不会打开“代理作业属性”下的“通知”选项卡/对话框。【参考方案2】:

问题:是否可以针对特定工作设置向多个操作员发送通知电子邮件?

我不相信这是可能的。

当然,看看[msdb].[dbo].[sysjobs] 的结构,各种operator_id 列都在此表中,这将支持一对多是不可能的想法。

但有一些替代方案

    您可以使用以分号分隔的电子邮件地址列表创建新的运算符。查看sysoperators 的定义,这对于适合nvarchar(100) 的字符串很有用 如果您需要超出此范围,您可以在 Exchange 等上设置电子邮件通讯组。

【讨论】:

我们在我工作的地方使用电子邮件组方法(Exchange 分发列表),直到我们的 DL 安全策略在 Exchange 端更改为“要求所有发件人都经过身份验证”。对单个电子邮件地址的通知仍然有效,因此这是一个方便的(希望是临时的)解决方法。不过,100 个字符并没有完全浪费空间。给出一个想法,仅 3 个电子邮件地址就为我们带来了 56 个字符。 请看下面的答案,如果是真的,请删除这个答案,EXECUTE msdb.dbo.sp_update_operator @email_address = N'person1@company.org;person2@company.org'; @apple 这与下面的答案相同。 “不可能”是指多个运营商而不是多个电子邮件地址。【参考方案3】:

因此,如果我的目的是在工作失败时通知组织中的多个人,并在成功时通知不同的多人组,这就是我想出的解决方法。

您会注意到步骤 1-3 是计划作业用于执行的正常任务,就像您为任务执行的操作一样。在这些之前可以有尽可能多的步骤,但该过程的最后一步(步骤 3)需要打破“成功时”和“失败时”以进入单独的电子邮件。此外,所有“失败时”都需要继续发送到您的“失败电子邮件”,如下所示。因此,Failure 组会收到电子邮件,而历史记录中的作业仍然会失败。

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

失败的电子邮件步骤 - 常规属性

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

成功的电子邮件步骤 - 常规属性

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

为其他需要帮助的人。 Notify multiple operators with difference results

【讨论】:

虽然 dbahiker 没有直接解决原始问题提出的问题,但我认为它被低估了(-1)。这是解决 SQL 代理运算符限制的可行解决方案。【参考方案4】:

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

SSMS>SQL Server Agent>Operators 中创建一个新的OPERATOREDIT,并在"E-mail name:" 框中添加以; 分隔的其他电子邮件地址。

【讨论】:

这需要更高 @mmcrae 或者你可以学习阅读。您刚刚投反对票的答案包含You could create a new operator with the semi colon delimited list of email addresses 这一行 @MartinSmith - 这个更清楚 imo (“你可以学会阅读” - 优雅!)你的答案更侧重于问题的文字查询(关于运算符),但很明显 OP 是只是在寻找一种简单的方法来通过电子邮件发送多个地址……这就是简单的方法。 没有工作,因为我的电子邮件列表超过 100 个字符。即使在扩展“email_address”列的列宽以能够容纳多个电子邮件地址(如果总长度 > 100 个字符)之后,使用:USE msdb; ALTER TABLE 系统操作员; ALTER 列 email_address NVARCHAR(2000);这使得 SSMS GUI 无用,因为它不会打开“代理作业属性”下的“通知”选项卡/对话框。我不得不采用 T-SQL 方法(通过添加额外的步骤来跳转到“成功/失败操作”)。【参考方案5】:

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

【讨论】:

这就是我们在我工作的地方的做法。假设您的所有管理员都是名为 DBA 的 Outlook 通讯组的一部分。您将创建一个名为“DBA”的代理操作员,其电子邮件地址为“DBA@company.org”,以通知通讯组中的每个人。【参考方案6】:

如果打算在作业失败时通知组织中的多人,您可以更改操作员的电子邮件地址以包含多个邮箱,方法是用分号分隔每个邮箱。

我假设您通知的操作员称为 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 将在作业失败时收到邮件。

【讨论】:

这是正确的,尽管有人已经声明该字段只允许 100 个字符,很快就会被多个地址填满。 @MarkHedley 这是一个短期解决方案,但如果您难以更改邮件服务器上的组,它可能仍然有用。我试图更新答案,但 SO 刚刚出错。我稍后再试。感谢您的反馈! 100 个字符问题的一个令人讨厌的副产品是它会让你放置超过 100 个字符,但在你点击 OK 后就会将其切断!

以上是关于SQL Server 代理作业在失败时通知多个操作员的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

错误:注意:无法通过电子邮件通知“操作员”。当作业失败时尝试发送电子邮件

SQL Server 2008 R2中配置作业失败后邮件发送通知

SQL Server代理警报

复制数据库 SQL Server 2012 中的“作业失败”

SQL Server作业失败 - 帐户被锁定