Несколько писем, отправленных sp_db_sendmail при запуске как пакет служб SSIS
У меня есть процедура, которая генерирует текстовый файл с разделителями табуляции, а также отправляет электронное письмо со списком студентов в виде вложения, используя msdb.dbo.sp_send_dbmail.
Когда я выполняю процедуру в студии управления SQL-сервером, она отправляет только одно электронное письмо. Но я создал пакет служб SSIS и запланировал выполнение задания на ночь. Это задание отправляет 4 копии письма каждому получателю.
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'A'
,@recipients = @email_address
,@subject = 'Error Records'
,@query = 'SELECT * FROM ##xxxx'
,@attach_query_result_as_file = 1
,@query_attachment_filename = 'results.txt'
,@query_result_header = 1
,@query_result_width=8000
,@body = 'These students were not imported'
Я установил для следующих параметров значение 0 (в мастере настройки почты базы данных), чтобы увидеть, имеет ли это какое-либо значение. Но это не решило проблему. AccountRetryAttempts 0 AccountRetryDelay 0 DatabaseMailExeMinimumLifeTime 0
Какие-либо предложения?
2 ответа
Проверьте решение здесь (оно работало для меня, поскольку я получал 2 за раз) - Хранимая процедура с использованием SP_SEND_DBMAIL отправки дубликатов электронных писем всем получателям
Измените количество повторных попыток с X на 0. Теперь я получаю только 1 электронное письмо. Это будет более очевидно, если ваши пользователи получат 4 электронных письма с интервалом в 1 минуту.
Я предполагаю, что у вас есть это электронное письмо, связанное с событием, например OnError/OnTaskFailed, возможно, на корневом уровне.
Каждый элемент, который вы добавляете в поток управления, добавляет еще один слой потенциальных событий. Представь себе Control Flow
с Sequence Container
который содержит ForEach Enumerator
который содержит Data Flow Task
, Это довольно распространенный дизайн. Каждый из этих объектов имеет возможность вызывать / обрабатывать события на основе объектов, которые он содержит. Расстояние между обработчиком события OnTaskFailed потока управления и обработчиком события OnTaskFailed потока данных составляет 5 объектов.
Поток данных не удается и вызывает сообщение OnTaskFailed. Это сообщение пузырится вплоть до потока управления, в результате чего электронная почта 1 запускается. Затем поток данных завершается. Цикл ForEach получает сигнал о том, что поток данных завершен и состояние возврата было ошибочным, поэтому теперь возникает ошибка OnTaskFailed для цикла Foreach. Повторяйте этот шаблон до тошноты, пока каждое задание / контейнер не вызовет свое собственное событие.
Разрешение зависит, но обычно люди обходят это, либо помещая уведомление только на самые внутренние объекты (поток данных в моем примере), либо отключая фильтрацию обработчиков событий.