SQL自定义警报

时间:2014-11-17 22:05:55

标签: sql sql-server sql-agent-job

所以我试图在Microsoft SQL 2014中设置自定义提醒。 我想在队列中排队时间超过30分钟时向我的团队发送电子邮件。

我保证我已经对它进行了相当多的研究,但是其他人在这里发布的与此类似的问题并没有帮助。

我设置了数据库邮件配置文件,并发送了测试电子邮件。有用。

然后我转到SQL Alert管理器设置新警报。

我将命名空间保留为它给我的默认名称:\。\ root \ Microsoft \ SqlServer \ ServerEvents \ MSSQLSERVER 我的脚本如下:

if (exists (Select 1
            From ____
            where Status = 'WAITING' and
                  (GETDATE() - [ITIME]) > 0.5 * (1.0/24)
           )
   )
BEGIN

EXEC msdb.dbo.sp_send_dbmail
  @recipients='_______',
  @body='Attention: A job has been sitting in the _____ queue for longer than 30 minutes.', 
  @subject ='Queue Time Expiration',
  @profile_name ='__________',
  @query =
     'USE ___
     (select * from _____] where Status=''WAITING'' and (GETDATE() - [ITIME])>0.02)'

END

我收到此错误: SQLServerAgentError:WMI错误:0x80041058无法在提供的@wmi_namespace中执行@wmi_query。验证查询中选择的事件类是否存在于命名空间中,并且查询具有正确的语法。

我无法判断我的查询本身是否有问题,因为我以前从未编写过这种类型的脚本,而且在我去的时候还是有点做错,或者它是否有问题。命名空间。我没有更改名称空间,它只是默认名称。我真的不知道该放在那里,这就是我所关注的教程中所展示的内容。

编辑:我的脚本中的修复语法来自下面的建议,但仍无法正常工作

3 个答案:

答案 0 :(得分:3)

我想在分享这个问题之前分享一下我是如何解决这个问题的。我最终使用了一种不同的方法来解决这个问题而不是我遇到的问题。无论如何,戈登·林诺夫对我的剧本的批评是有帮助的,我认为Rajesh也有正确的想法,但我找到了一种对我来说更容易的方式。

我的问题的目标很简单:每当查询返回一些结果时,我希望我的团队收到一封电子邮件。在我的情况下,只要有任何物体在队列中等待超过30分钟。我为缺乏细节而道歉,我不想违反公司政策。我认为这可以通过警报系统来完成,但我从未管理过它。相反,我编写了一个作业,其中包括一个脚本,用于检查符合我标准的任何对象,然后通过电子邮件发送给我的团队(如果有的话)。这对DBA来说可能是显而易见的,但我对这些东西来说是超级新手,所以请原谅我的无知。

对于其他被困的人来说,这就是我的所作所为。本教程适用于2014年版本,我很抱歉,但由于我还没有足够的声誉,因此无法包含图片。我建议首先在测试数据库上运行这些步骤。

1。)写下您的查询

创建一个&#34;新查询&#34;,然后编写自己的查询,检查数据库中是否有您希望自动电子邮件通知的条件。只是一个简单的选择声明。 我们将稍微修改我们的查询,以记录符合条件的记录数量,其中&#34;其中&#34;变量@recordCount中的子句。我们还没有对recordCount做任何事情,但是我们确实执行了脚本以查看语法是否正确。继续创建自己的recordCount变量并将其分配给查询结果的计数并执行它以检查语法。 我们现在必须暂时不要设置我们的查询,以便我们可以在数据库中设置电子邮件,但我们将在步骤4中回复它,因此请务必保存或保持打开状态。< / p>

示例:

declare @recordCount int
Select @recordCount = isnull(count(*), 0)
From (table)
where (conditions)

足够简单。

第2步:创建电子邮件配置文件

我们需要为MSSQL创建一个配置文件,以便从发送电子邮件。这不是您希望发送通知的电子邮件地址,但它们可以是相同的电子邮件地址。 在对象资源管理器中,展开服务器节点,然后展开&#34;管理&#34;节点。您会看到一些名为&#34;数据库邮件的内容。&#34;双击它以启动数据库邮件配置向导。按&#34; next&#34;在介绍页面。 在数据库向导的第二页上,您将要选择第一个选项(它应该说明有关设置新配置文件的内容)。

•点击&#34;下一步。&#34;

•为您的个人资料命名。请记住,这是电子邮件发件人的名称,而不是收件人。

•填写适当的说明。

•点击&#34;添加。&#34;

•在出现的弹出窗口中,选择&#34;新帐户。&#34;

•在&#34;新数据库邮件帐户&#34;出现的窗口,为您的帐户提供名称和说明。

•在&#34;发送邮件服务器&#34;部分,指定发件人的电子邮件地址并为其指定显示名称。

•您需要知道您正在使用的电子邮件帐户的SMTP服务器。如果是@ intel.com帐户,请写下smtp.intel.com,如下所示。 Google Mail使用smtp.google.com,雅虎使用smtp.mail.yahoo.com。

•有关最受欢迎的电子邮件提供商的smtp服务器名称列表,请点击以下链接:http://www.serversmtp.com/en/what-is-my-smtp

•您还需要知道端口号。

•在&#34;身份验证&#34;部分,您很可能想要第一个选项,但如果您知道此帐户的电子邮件和密码登录,则可以选择第二个选项并提供它们。

•单击“确定”。

•在下一个屏幕上,如果合理,请选择公开个人资料,并在最右侧列中选择此个人资料作为默认配置文件。

•单击“下一步”。

•在下一页上,保留默认选项,然后单击&#34;下一步。&#34;

•在最后一页上,查看您的更改,然后点击&#34;完成。&#34;

步骤3:在服务器代理上启用电子邮件

•如果展开服务器并向下滚动,您将看到&#34; SQL Server代理。&#34;右键单击此项并选择&#34;属性。&#34;

•在左侧边栏中,选择&#34;警报系统。&#34;

•在&#34;邮件会话下,&#34;确保&#34;启用邮件配置文件&#34;检查。 &#34;邮件系统:&#34;应设置为&#34;数据库邮件,&#34;并且您要选择在步骤2中为邮件配置文件创建的配置文件。 •在&#34; Pager电子邮件的底部&#34;部分,检查&#34;在通知消息中包含电子邮件正文。&#34;

•选择确定。

•您想要重新启动代理。回到对象资源管理器中,右键单击&#34; SQL Server代理&#34;再次选择&#34;开始&#34;或者&#34;重启。&#34;

•即使已在代理上启用了电子邮件,您仍可能禁用了数据库邮件。创建一个&#34;新查询&#34;并复制粘贴以下短脚本。这将设置&#34;数据库邮件XP&#34;变量为1,表示已启用:sp_configure&#39;显示高级选项&#39;,1;

GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE
GO

•向上滚动到&#34;数据库邮件&#34; “服务器名称”下的对象资源管理器中的选项&gt;管理。右键单击并选择&#34;发送测试电子邮件。&#34;在弹出的窗口中,确保选择新的个人资料帐户作为个人资料,并在&#34; To:&#34; line指定您自己的电子邮件地址。 •您应该在几分钟内收到测试电子邮件。

第4步:编写脚本

•我们将从步骤1扩展我们的查询。

•据推测,如果查询返回一些记录,我们希望收到通知。所以我们将查询扩展到以下脚本:

declare @recordCount int
 Select @recordCount = isnull(count(*), 0)
From (your table)
 where (your criteria)

IF (@recordCount > 0)
 Begin
 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'the name of the profile you created in step 2',
 @recipients = 'your email address',
 @query = 'select * from (your table - same as above) where (your criteria - same as above)' ,
 @subject = 'your email subject',
 @Body = 'your e-mail message'
 End

•在这个新脚本的顶部,我们可以看到之前的确切查询。在它下面,有一个条件声明。它说,如果有任何符合我们查询条件的记录,则执行send_dbmail命令。继续并在新查询中复制粘贴此脚本,填写必要的信息。由于这是一项测试,您可能希望为收件人提供自己的电子邮件地址。另外,请确保为其提供您为自己创建的个人资料提供的确切名称。

注意:如果您已经忘记了自己创建的个人资料的名称,或者您对确切的拼写或外壳不确定,请右键单击对象资源管理器中的SQL Server代理并选择&#34;属性&#34。在左侧栏中选择&#34;警报系统。&#34;在页面顶部,将指定配置文件的名称。获得后,取消此窗口。

•一旦您用自己的材料替换了粗体部分,请突出显示整个脚本并执行它。如果找不到符合条件的记录,您将收到消息&#34;命令已成功完成。&#34;如果找到至少一条记录,您将收到消息&#34; Mail Queued。&#34;

•如果您收到消息&#34;命令已成功完成,&#34;继续创建符合条件的虚拟记录并触发电子邮件,然后再次运行脚本。

•您应该在几分钟内收到电子邮件。请注意,电子邮件很丑,格式不正确。我们现在就解决这个问题。

•要格式化我们的电子邮件,我们需要再次调整我们的脚本。在下面的示例中,我使用HTML格式化了电子邮件,以便查询结果显示在一个简单的表中。需要更改的内容以粗体显示。

declare @recordCount int
Select @recordCount = isnull(count(*), 0)
From **(table)**
where **(conditions)**



IF (@recordCount > 0)
Begin
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT **[(column)]** AS 'td','',**[(column)]** AS 'td','',
**[(column)]** AS 'td','', **(column)** AS 'td'
FROM **(table)**
where **(conditions)**
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='**(Message at beginning of email)**' <br> <br>      <br>
 <html><body><H3 style="color:#3333FF">**(Label for your table)**</H3>
 <table border = 1> 
 <tr>
 <th> **(Column header text)**</th> <th> **(Column header text)** </th> <th> **(Column header text)** </th>     <th> **(Column header text)** </th></tr>'

SET @body = @body + @xml +'</table></body></html>'

EXEC msdb.dbo.sp_send_dbmail
 @profile_name = '**(profile name from last step)'**,
 @recipients = '**(recipient e-mail)**',
 @subject = '**(Email subject)**',
@Body = @body,
 @Body_format='HTML'
 End

•最重要的是您添加变量@Body_format并将其设置为HTML。然后,您可以将变量@Body添加到脚本中,并将其设置为电子邮件中所需的HTML内容。不要忘记在底部的EXEC块内设置@Body等于@body。其他一切都只是简单的标记。结果是一个简单的表,但您可以将标记更改为您喜欢的任何内容。

•继续保存您的脚本。我们将在最后一步中使用它。

步骤5:设置作业以运行我们的脚本

•我们差不多完成了!现在我们的脚本正在运行,我们需要做的就是设置一个工作来按计划运行这个脚本。在服务器下的对象资源管理器中,展开SQL Server代理。右击&#34; Jobs&#34;并选择&#34;新工作。&#34;

•为您的工作提供姓名和说明,让所有者保持默认登录状态,以及&#34;类别&#34;可以设置为&#34; [未分类:(本地)]。&#34;确保&#34;启用&#34;检查。

•在左侧边栏中,选择&#34;步骤。&#34;

•在底部,选择&#34;新。&#34;

•在弹出的窗口中,为步骤命名。设置&#34;类型&#34; to&#34; Transact-SQL脚本(T-SQL),&#34;并选择适当的数据库。 &#34;以&#34;可以留空。

•点击&#34;打开&#34;按钮,然后选择您在步骤4中保存的脚本。该工具将自动填充您的脚本。您可以点击&#34; Parse&#34;最后一次检查脚本的语法。

•单击“确定”。

•在“新建作业”窗口的左侧边栏中,选择&#34;计划。&#34;在底部,按&#34;新建。&#34;

•确保&#34;已启用&#34;已经过检查,并且您已为自己的日程安排命名。

•您如何设置日程安排取决于您。您可以将作业安排为运行一次,或将其设置为重复运行,并允许其在每个月,周,日,分钟或秒内执行,无论是无限期还是特定结束日期,仅在工作日或全天候执行。 / p>

•查看底部的&#34;摘要&#34;确保这是你想要的。单击“确定”。

•回到&#34;新工作&#34;窗口,单击&#34;确定。&#34;

•确保SQL Server代理正在运行,并展开作业。您现在应该在列表中看到您的工作,如果没有,您可以右键单击&#34;工作&#34;并选择&#34;刷新。&#34;

•在列表中找到您的工作,右键单击它,然后选择&#34;在步骤中开始工作...&#34;

•您的工作现在正在运行,并且会按照您的预定继续运行!如果您需要编辑它,只需双击即可。

还有问题吗? •本教程是从以下两个资源创建的:

1。)Microsoft的数据库邮件文档:http://msdn.microsoft.com/en-us/library/ms187605.aspx

2.)抱歉,无法发布第二个资源链接,因为我还没有声誉。只是谷歌Microsoft SQL Server故障排除。

谢谢大家。

答案 1 :(得分:0)

您可能还有其他问题,但您的if代码没有意义。您正在执行创建结果集的查询,然后您有if。这应该在代码的那一部分做你想做的事情:

declare @WaitTime datetime;

Select @WaitTime = [ITIME]
From ______________
where Status='WAITING' ;

IF (GETDATE() - @WAITTIME) > 0.02 . . .

我认为你已经完成了计算,0.02天就是你真正想要的。否则你将使用0.5 / 24作为常数。

您还可以将变量,查询和if替换为:

if (exists (Select 1
            From ______________
            where Status = 'WAITING' and
                  IF (GETDATE() - ITIME) > 0.5 * (1.0/24)
           )
   )

答案 2 :(得分:0)

您使用了错误的命名空间,CIM_DataFile WMI类是\root\CIMV2命名空间的一部分而不是\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER

SQL Server Alert using WMI Event ERROR中用于解决错误的查询是

EXEC msdb.dbo.sp_add_alert @name=N'SimpleFolderWatcher', @message_id=0,
@severity=0,@enabled=1,@delay_between_responses=0, 
@include_event_description_in=0,@category_name=N'[Uncategorized]',  
@wmi_namespace=N'\\.\root\cimv2', 
@wmi_query=N'SELECT * FROM __InstanceCreationEvent WITHIN 1 
WHERE TargetInstance ISA ''CIM_DataFile'' 
AND TargetInstance.Drive = ''C:'' 
AND TargetInstance.Path=''\\testfolder\\'' 
AND TargetInstance.Name LIKE ''C:\\%'' ', 
@job_id=N'0-0-0'