将数据插入表时SQL Server电子邮件触发器不起作用

将数据插入表时SQL Server电子邮件触发器不起作用,sql,sql-server,sql-server-2012,triggers,Sql,Sql Server,Sql Server 2012,Triggers,我在创建一个触发器时遇到问题,该触发器将在设备停靠到IP下载程序并将数据发送到SQL Server中的表时,向通讯组列表发送包含插入数据表的电子邮件。我需要在一次下载中选择日期、下载ID和最新条目23-26行的描述,然后将其格式化为电子邮件并发送出去 我对SQL比较陌生,所以我不确定需要在哪里查看触发器生成的错误。下面是我一直试图使用的代码块。如有任何建议或建议,将不胜感激。当我手动运行select语句和电子邮件存储过程时,它工作正常。一旦我把它变成触发器,它就会失败 CREATE TRIGGE

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

我对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

谢谢

尽管我强烈同意您不应该将此发送电子邮件逻辑放在触发器中,将您的问题视为学术问题,但我建议您可以将当前触发器代码从第一次声明到最后一次执行包装在TRY..CATCH块中,该块可以让您记录代码中发生的任何错误,以及通过不抛出错误来防止事务回滚


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

考虑将电子邮件发送命令放入填充表的代码中。我没有权限修改填充表的代码,就像@lad2025所说的,不要这样做;它会引起各种各样的问题。例如,如果电子邮件因任何原因无法发送,可能是您的电子邮件服务器已关闭,或者未经允许使用sp_send_dbmail的人尝试进行插入,则插入将失败。这不应该是故意的行为。触发器是您发送电子邮件时最不应该使用的逻辑位置之一。触发器与引发它的代码在同一事务中运行,因此请将该代码添加到您的问题中。我看不出触发代码有任何明显的错误。你还说它不起作用,但你不知道错误是什么。你怎么知道有错误?你不工作是什么意思?谢谢。我将研究使用作业代理来运行任务而不是触发器