扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源: 2007年03月22日
关键字:SQL Server SQL Server 2005 SQL Server 2005 SQLServer SQLServer SQLServer SQLServer Tim Chapman Tim Chapman
我在文章《在SQL Server 2005中用数据库邮件发送电子邮件》一文中讨论了发送问题通告的重要性,这样你才能做出调整,修复问题,并最终防止它再次发生。本周,我将创建一个小型定制通告系统,如果问题出现,它将向相关人员发送一条消息。
注:本文以Service Broker和数据库邮件(Database Mail)为基础。如果你的SQL Server 2005中没有安装这两个组件,下面的例子将不能正常运行。请参考我以前的文章帮助你配置这两项功能。
创建通告系统
通告系统将利用Service Broker的异步消息功能和内部激活来排列一个通告消息并在后台发送。列表A建立我将要用到的Service Broker对象。
我还需要在服务器上安装数据库邮件。同时,我将在这个例子中使用我在前面的文章中建立的相同资料和账户。
我需要一个表来保存需要接收通告的个人。建立这个表的脚本如下。
CREATE TABLE NotificationSeverity
(
IDCol SMALLINT IDENTITY(1,1) PRIMARY KEY,
Severity SMALLINT,
SeverityDescription VARCHAR(50)
Email VARCHAR(75)
)
GO
接下来,在这个表中添加一些记录,确保有人会收到通告。查看列表B。
列表C在服务器上建立一个存储过程,它将从NotificationQueue中提取消息并进行处理。这个过程就是我们的“内部激活”过程,意味着NotificationQueue收到消息就调用这个过程。
如果你不熟悉SQL Server 2005的一些新特性,那么你需要注意这个过程中的几个问题。TRY…CATCH结构帮助你更方便地查出错误。实际上,你可以使用一个多功能过程来检查这些错误,将它们记录到一个表中方便以后搜索。欲了解如何使用SQL Server 2005的TRY…CATCH结构,请参考这篇文章。
注意,上面脚本中的语句以SELECT @eMailList =开头。这个语句方使用FLWOR,它是一个XML查询结构。我将利用由查询返回的电子邮件地址,把它们连接起来,并用分号隔开。在调用数据库邮件过程时,你可以用这个@eMailList 变量作为参数。
下一步即修改NotificationQueue,以便在消息到达队列(Queue)时,它知道自动激活前面建立的过程。
ALTER QUEUE NotificationQueue WITH ACTIVATION
(
STATUS = ON,
MAX_QUEUE_READERS = 1,
PROCEDURE_NAME = usp_RecordNotificationMessage,
EXECUTE AS OWNER
);
GO
最后,你需要建立一个过程发送通告。这个过程只需要知道发生什么问题,以及问题的严重程度。其它组件将根据我们的NotificationSeverity表,取得这个过程发送的消息,决定需要通知哪些人员。见列表D。
如果你调用这个过程,NotificationQueue中将出现一条消息,它再调用内部激活过程来处理这条消息。
EXECUTE usp_SendNotification 'A Severe Error has occurred.', 1
改进通告系统
如果你的系统出现问题,上面创建的实例将保证会通知必要的用户。但是,你可以对它进行改进,使它对你更加有利。例如,你可以让调用在usp_LogProcedureError过程内发送通告,让那个过程根据发生错误的类型决定问题的严重程度。
这种细小的改进,以及从不同角度考虑如何处理通告,很可能会帮助你发现问题,建立一个更优秀的系统,预防错误发生。
Tim Chapman是肯塔基州路易维尔市一家银行的SQL Server数据库管理员,他有超过7年的IT行业经验。他还通过了微软SQL Server 2000和SQL Server 2005的认证。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。