SQL Server 2000 上的警报和通知问题

MAW*_*656 2 sql-server sql-server-2000 sql-server-agent

我正在尝试在 SQL Server 2000 中设置警报和通知,但它们不起作用。我正在测试它们的代理计划作业,我收到一条说明:

注意:无法通过电子邮件通知“[operatorname]”。

然后在当前错误日志中,我看到如下条目:

[264] 在没有建立电子邮件会话时尝试发送电子邮件

xp_sendmail 工作正常,我实际上在这些代理工作中使用它。通知应该告诉我程序已成功完成。我只是要求完成通知才能使其正常工作,然后我会将其更改为失败通知。

任何人都知道为什么会发生这种情况以及如何纠正?我真的很想通知工作。

Aar*_*and 7

对于 SQL Server 2000,老实说,我不会费心让操作符工作。SQL Mail 是皇家 PITA,需要在服务器上安装 Outlook 或类似的邮件客户端。我宁愿只是设置每个作业都有一个称为“失败邮件”的步骤,它使用令牌来识别作业,然后调用存储过程。如果您设置了一个步骤以在失败时转到该步骤,则您只会在工作流程中到达该步骤。否则,它之前的步骤只会成功退出工作。

几个选择:

(1) 当我仍然跨界使用 SQL Server 2000 时,我使用 xp_smtp_sendmail 取得了巨大成功。挑战是它曾经在 sqldev.net 上可用,但 Gert 似乎已经放弃了该站点。因此,您可能需要四处搜索才能找到 DLL 的副本。它是由 Microsoft 员工编写的,但适用标准的“仅从可信来源下载”免责声明。

(2) 使用 CDO。与 SQL Mail 相同的 ick 因素,但不依赖于 Outlook / MAPI。有关一些信息,请参阅此知识库文章,但这里有一个示例,该示例设置存储过程以发送作业邮件失败,然后如何在作业步骤中包含作业令牌以调用该存储过程。

首先,发送电子邮件的通用程序(您可能希望将其重用于不仅仅是作业失败):

CREATE PROCEDURE [dbo].[sp_send_cdosysmail]
   @From       VARCHAR(320)   = 'default_admin@yourcompany.com',
   @To         VARCHAR(320)   = 'default_admin@yourcompany.com',
   @Subject    NVARCHAR(4000) = N'',
   @Body       NVARCHAR(4000) = N'',
   @SMTPServer VARCHAR(2000)  = '127.0.0.1'
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @obj INT;

  EXEC sp_OACreate 'CDO.Message', @obj OUTPUT;
  EXEC sp_OASetProperty           @obj,
    'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value',
    '2';
  EXEC sp_OASetProperty           @obj,
    'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value',
    @SMTPServer;
  EXEC sp_OAMethod                @obj,
    'Configuration.Fields.Update',
    NULL;
  EXEC sp_OASetProperty           @obj, 'To',       @To;
  EXEC sp_OASetProperty           @obj, 'From',     @From;
  EXEC sp_OASetProperty           @obj, 'Subject',  @Subject;
  EXEC sp_OASetProperty           @obj, 'TextBody', @Body;
  EXEC sp_OAMethod                @obj, 'Send',     NULL;
  EXEC sp_OADestroy               @obj;
END
GO
Run Code Online (Sandbox Code Playgroud)

接下来,处理专门针对作业失败的电子邮件的过程:

CREATE PROCEDURE dbo.JobAlertSender
   @To      VARCHAR(320) = 'default_admin@yourcompany.com',
   @job_id  VARCHAR(36)
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE @Subject NVARCHAR(4000);
   SELECT @Subject = N'Job failed: ' + name
       FROM msdb.dbo.sysjobs
       WHERE job_id = @job_id;

   DECLARE @Body NVARCHAR(4000);
   SET @Body = CONVERT(CHAR(10), GETDATE(), 120) 
       + ' ' + CONVERT(CHAR(5),  GETDATE(), 108);

   EXEC dbo.sp_send_cdosysmail
        @From    = 'default_admin@yourcompany.com',
        @To      = @To,
        @Subject = @Subject,
        @Body    = @Body;
END
GO
Run Code Online (Sandbox Code Playgroud)

现在您可以向您的作业添加一个调用此过程的步骤。如果上一步失败,您只会点击这一步。该步骤的代码如下(请注意,您可能希望根据工作覆盖默认的“收件人”人员):

EXEC master.dbo.JobAlertSender
   -- @To = 'override@yourcompany.com',
   @job_id = '(JOBID)';
Run Code Online (Sandbox Code Playgroud)

以下是作业步骤的外观:

在此处输入图片说明

以下是您设置先前步骤的方法,使用“转到下一步”或从下拉列表中明确选择失败步骤:

在此处输入图片说明

如果您找到 xp_smtp_sendmail,您只需调用与dbo.JobAlertSender.

如果您没有有效的 SMTP 服务器,则需要在本地安装 SMTP 服务器。如需帮助,您需要使用SuperUserServerFault。如果您同时需要在本地测试某些东西,没有什么比smtp4dev更简单的了。您不会在收件箱中收到电子邮件,但您可以验证内容、标题等,直到您拥有合适的 SMTP 服务器。

Google 还告诉我这篇文章在 2002 年写的,其中可能包含一些有用的信息。