创建Windows服务以在更新sql数据库时发送自动电子邮件

时间:2012-02-06 07:38:55

标签: c# sql windows-services

我的Windows服务必须在更新sql数据库时发送自动电子邮件。

我怎样才能做到这一点?任何代码或教程都会对我有所帮助

1 个答案:

答案 0 :(得分:3)

解决方案1 ​​ - 使用sp_send_dbmail

以下是创建在特定表上发生INSERT / UPDATE / DELETE事件时发送电子邮件的触发器的示例:

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
    DROP TRIGGER Sales.reminder2;
GO
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AdventureWorks2008R2 Administrator',
        @recipients = 'danw@Adventure-Works.com',
        @body = 'Don''t forget to print a report for the sales force.',
        @subject = 'Reminder';
GO

来源:http://msdn.microsoft.com/en-us/library/ms189799.aspx

SQL Server 2005中引入了

sp_send_dbmail。更多信息:http://msdn.microsoft.com/en-us/library/ms190307.aspx

注意:

  

使用前,必须使用数据库邮件启用数据库邮件   配置向导,SQL Server表面区域配置工具,   或sp_configure。

解决方案2 - 使用xp_cmdshell

如果您无法设置数据库邮件,则还有另一个选项:xp_cmdshell。 有了它,您可以在SQL语句中运行命令行命令,例如一个小小的电子邮件发送工具。

这是一个小例子,如何在C#应用程序中使用System.Net.Mail发送电子邮件:http://weblogs.asp.net/scottgu/archive/2005/12/10/432854.aspx

如何使用xp_cmdshellhttp://msdn.microsoft.com/en-us/library/aa260689%28v=sql.80%29.aspx

因此,您创建一个小型C#控制台应用程序,用于发送电子邮件,然后直接从SQL语句中使用xp_cmdshell执行它。

解决方案3 - 使用Windows服务 (按照自己的意愿)

Windows服务无法自行确定是否在MSSQL数据库中更新了行。您需要记录更改。为此,您可以为特定表创建触发器以记录更改。通过记录更改,我的意思是将新行插入到log表中,并使用如下触发器:

USE MyDatabase;
GO
IF OBJECT_ID ('Products.TRRowUpdated','TR') IS NOT NULL
    DROP TRIGGER Products.TRRowUpdated;
GO
CREATE TRIGGER TRRowUpdated
ON Products
AFTER INSERT, UPDATE, DELETE 
AS
   INSERT INTO log ('Message', 'Date') VALUES ('Products table got modified', GETTIME())
GO

创建Windows服务项目就像使用Visual Studio创建控制台应用程序一样简单。

然后,您的服务将像每分钟一样阅读“日志”表,并在其中有任何行时发送电子邮件(并删除它们当然)。

可以确定发生了哪种更改:INSERT,UPDATE或DELETE。有关详情,请参阅本网站上的评论:http://msdn.microsoft.com/en-us/library/ms189799.aspx