一行更改时发送电子邮件

时间:2016-01-18 12:05:44

标签: sql-server-2008-express

我会尽力解释我想做的事情(为简单起见,我只包括两个我正在使用的专栏):

  1. 我有两个不同的表,dbo.device和dbo.devicestatus。
  2. 它们都与DeviceDN绑定,后者是主键。
  3. 在dbo.devicestatus上,有两列名为TonerLowB和TonerLowY,其值可以是1或0。 我想做的是让应用程序(SQLExpress 2008)在TonerLowB或TonerLowY的行之一将其值更新为“1”时发送电子邮件,但是当它的值更新为“0”时不发送电子邮件将该行与dbo.device中的数据“合并”。 到目前为止我设法做的是将来自dbo.device的数据与来自dbo.devicestatus的数据结合起来,并且只显示大于0的值作为select语句:
  4. `

    select d.DeviceDN, s.TonerLowB, s.TonerLowY
    from dbo.Device d,
    dbo.DeviceStatus s
    where
    d.DeviceDN = s.DeviceDN
    and s.TonerLowB + s.TonerLowY > 0 ;
    

    `

    然后我用sp_send_dbmail修改,看看我是否可以通过邮件发送结果,我确实设法在定义配置文件并创建自己的测试邮件服务器后执行此操作。我使用了以下命令:

    `

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'MyMailProfile',
        @recipients = 'alex@testing.ro',
        @query = 'select d.DeviceDN, s.TonerLowB, s.TonerLowY
    from dbo.Device d,
    dbo.DeviceStatus s
    where
    d.DeviceDN = s.DeviceDN
    and s.TonerLowB + s.TonerLowY > 0 ;' ,
        @subject = 'Your Query Results',
        @attach_query_result_as_file = 1 ,
        @query_result_separator = '|' ;
    

    `

    问题是,这会向我发送值大于1的所有行,并且我不知道如何为每个更新发送,而只是为更新的行而不是此“批量”方法。

    我正在考虑向数据库db.devicestatus,TonerLowB_LastUpdate和TonerLowY_LastUpdate添加两个新列,两者都设置为“datetime”。 然后我想创建两个触发器,当TonerLowB或TonerLowY更新它的值时,将使用“set gettime()”更新TonerLowB_LastUpdate或TonerLowY_LastUpdate,并发送一封电子邮件,其中包含更改其值的行(使用我上面提到的邮件程序) ,如果该日期超过3天。 不幸的是我不知道如何声明这个触发器,这就是我想要寻求帮助的地方。

    这是可能的,如果是的话,它会是一个好的(可靠的)机制吗?

1 个答案:

答案 0 :(得分:0)

一种明智的方法是使用'触发器'在这种情况下。

看一下这篇文章就可以开始了 Using Triggers to do actions after specific values are updated 总而言之,在字段上定义更新触发器:

CREATE TRIGGER TonerValueChanged
   ON  DeviceStatus 
   AFTER UPDATE
AS 
BEGIN
// here you need to check for the condition if the value is updated to 1 and send the mail
END

现在,根据您的条件更新每个值,将触发邮件 每行更新。

希望这有帮助。