Триггер электронной почты SQL Server при вставке данных в таблицу не работает - PullRequest
0 голосов
/ 01 мая 2018

У меня проблемы с созданием триггера, который отправит сообщение электронной почты, содержащее таблицу вставленных данных, в список рассылки, когда устройство подключено к загрузчику IP-адресов, и данные отправляются в таблицу на SQL Server. Мне нужно, чтобы Date, DownloadID и Description из самых последних записей (23-26 строк в одной загрузке) были выбраны, а затем отформатированы в электронное письмо и отправлены.

Я относительно новичок в SQL, поэтому я не уверен, где мне нужно посмотреть, какую ошибку генерирует триггер. Ниже приведен блок кода, с которым я пытался работать. Любые предложения или советы будут оценены. Когда я запускаю оператор выбора и хранимую процедуру электронной почты вручную, она работает нормально. Как только я превращаю его в триггер, он выходит из строя.

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

Спасибо

1 Ответ

0 голосов
/ 01 мая 2018

Хотя я полностью согласен с тем, что вы не должны использовать эту логику «Отправить электронную почту» в триггере, рассматривая свой вопрос как академический, я предлагаю вам перенести текущий код триггера (с первого DECLARE до последнего EXEC) в блоке TRY..CATCH, который может позволить вам регистрировать любую ошибку, которая происходит в этом коде, а также предотвращать откат транзакции, не генерируя ошибку.

Кстати, поскольку никто не предложил конкретную альтернативу, я скажу вам, что мы реализуем такую ​​логику с помощью задания агента, которое выполняется через регулярные промежутки времени и отправляет электронные письма в зависимости от того, какие строки были добавлены с последнего раза работа закончилась. Вы можете добавить столбец (столбцы) в таблицу DownloadData, которая отслеживает, было ли отправлено письмо, или использовать триггер AFTER INSERT, чтобы заполнить отдельную таблицу, которую задание рассматривает как очередь электронной почты.

...