【问题标题】:SQL Server email trigger upon data insertion into a table not working将数据插入到表中时 SQL Server 电子邮件触发器不起作用
【发布时间】:2018-10-11 18:48:51
【问题描述】:

我在创建触发器时遇到问题,当设备连接到 IP 下载器并将数据发送到 SQL Server 中的表时,该触发器将向分发列表发送包含插入数据表的电子邮件。我需要从最近的条目(一次下载中的 23-26 行)中选择日期、下载 ID 和描述,然后将其格式化为电子邮件并发送出去。

我对 SQL 比较陌生,所以我不确定我需要在哪里查看触发器正在生成什么错误。下面是我一直在尝试使用的代码块。任何建议或意见将不胜感激。当我手动运行 select 语句和电子邮件存储过程时,它工作正常。一旦我把它变成触发器,它就会失败。

CREATE TRIGGER [dbo].[Trg_Download] 
ON [dbo].[DownloadData] 
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DownloadID VARCHAR(7)
    DECLARE @xml NVARCHAR(MAX)
    DECLARE @body NVARCHAR(MAX)

    SET @DownloadID = (SELECT TOP 1 downloadID 
                       FROM inserted 
                       ORDER BY downloadid DESC)

    SET @xml = CAST((SELECT [Date] AS 'td','',[DownloadID] AS 'td','', [Description] AS 'td'
                     FROM inserted
                     WHERE [DownloadID] = @downloadID
                     ORDER BY Description
                     FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
    SET @body = '<html><body><H3>Line Clearout Summary</H3>
<table border = 1> 
<tr>
<th> Date </th> <th> DownloadID </th> <th> Description </th></tr>'  

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

    EXEC msdb.dbo.sp_send_dbmail
              @profile_name = N'DBMail',
              @body = @body,
              @body_format = HTML,
              @recipients = N'DistributionList@GMAIL.com',
              @subject = 'Line Clearout Summary'
END

谢谢

【问题讨论】:

  • 考虑将电子邮件发送命令放在填充表格的代码中
  • 不幸的是,我无权修改填充表格的代码
  • 就像@lad2025 说的,不要这样做;它可能会导致各种问题。例如,如果电子邮件由于某种原因无法发送(可能您的电子邮件服务器已关闭,或者未经许可使用sp_send_dbmail 的人尝试发送INSERT),那么INSERT 将失败。这不应该是预期的行为。 TRIGGER 是您应该放置逻辑以发送电子邮件的最后一个位置之一。
  • 触发器与触发它的代码在同一事务中运行,因此请将该代码添加到您的问题中。我在触发代码中没有看到任何明显错误。你也说它不工作,但你不知道错误是什么。你怎么知道有错误? “不工作”是什么意思?

标签: sql sql-server sql-server-2012 triggers


【解决方案1】:

虽然我强烈同意您不应将此“发送电子邮件”逻辑放在触发器中,将您的问题视为学术问题,但我建议您可以包装您当前的触发器代码(从第一个 DECLARE 到最后一个 @ 987654322@) 在TRY..CATCH 块中,它可以让您记录该代码中发生的任何错误,并通过不引发错误来防止事务回滚。

顺便说一句,由于没有人提出具体的替代方案,我将告诉您,我们实现这种逻辑的方式是使用代理作业,该作业定期运行并根据自上次添加的行发送电子邮件工作跑了。您可以将列添加到 DownloadData 表以跟踪是否已发送电子邮件,也可以使用 AFTER INSERT 触发器填充作业视为电子邮件队列的单独表。

【讨论】:

  • 谢谢。我将研究使用作业代理来运行任务而不是触发器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多