2013-03-20 2 views
7

У меня есть хранимая процедура, которая запускается каждую ночь, которая должна отправлять результаты запроса нескольким получателям. Однако в большинстве дней он заканчивает отправку дубликата электронной почты через минуту. Код, я использую выглядит следующим образом (все письма и рефов базы данных были изменены):Сохраненная процедура с использованием SP_SEND_DBMAIL отправки повторяющихся писем всем получателям

EXEC msdb.dbo.sp_send_dbmail 
@recipients = '[email protected]', 
@copy_recipients = '[email protected];[email protected];[email protected]', 
@subject = 'Example Email', 
@profile_name = 'ExampleProfile', 
@query = 'SELECT name 
    FROM table 
    WHERE date BETWEEN (getdate() - 1) AND getdate()', 
@attach_query_result_as_file = 1 

Любая помощь с этим было бы весьма признателен.

+0

Звонок кажется хорошим, но как вы его называете? Вы уверены, что не называете это два раза? –

+0

Я вызываю его через диспетчер заданий в агенте SQL Server, и, насколько я вижу, он только один раз вызывается внутри Планировщика заданий. – andewM

+0

Вы проверили журнал? –

ответ

5

Решение оказалось уменьшающим количество учетных записей повторной учетной записи на сервере до 0 (в мастере настройки почтовой базы данных).

0

Если он отправляет повторяющиеся письма получателям, это означает, что ваш SP вызывается несколько раз в день. Проверьте время вызова, заданное в вашей задаче SQL, которая вызывает этот SP. Это должно быть один раз в день, чтобы избежать дублирования писем.

+0

Спасибо за ответ, но я проверил список заданий, и я уверен, что процедура выполняется только один раз. – andewM

0

Если он не отправляется дважды с SQL Server, а также не проблема с почтовым сервером, убедитесь, что вы не проверяете почту в Outlook с фильтрами для почты, тогда вы можете получить электронное письмо дважды.

+0

Спасибо за ввод, но я проверил, и я не использую фильтры почты Outlook. – andewM

0

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

Без такой таблицы вы не можете действительно знать, что происходит. Что делать, если вы запускаете SP несколько раз случайно? Ничто не мешает ему отправлять электронное письмо.

Относительно этой проблемы - ваш почтовый сервер хранит копию в отправляемых товарах? Если это возможно, вы можете проверить дату отправки всех сообщений там. Это может дать вам хорошую информацию о том, что происходит.

+0

Благодарим вас за ввод. Я отключил задание, чтобы проверить, была ли эта процедура запущена в другом месте, однако я обнаружил, что это не так, и закончил тем, что воссоздал работу, чтобы проверить, исправлена ​​ли проблема. Кажется, он сделал трюк. – andewM

+0

Я рад узнать, что я помог :) –

0

Это происходит потому, что адрес, получающий электронное письмо (либо в группе, либо в отдельности), имеет адрес электронной почты, который больше не действителен. Хотя вы можете исключить повторные попытки, как в принятом ответе, наилучшим подходом является очистка дистрибутива.

0

У меня была аналогичная проблема, когда у нас было несколько получателей в одном электронном письме, и он будет генерировать 2 отправленных письма. Проблема закончилась тем, что один из получателей уже недействителен, и повторная попытка отправит электронное письмо всем получателям, а не только тому, что не удалось. В msdb есть несколько видов, которые могут помочь вам найти недопустимого получателя. Они начинают dbo.sysmail_ < что-то >

Есть несколько вариантов решения этой проблемы.

  1. Разбивайте каждого получателя как отдельное письмо.
  2. Удалите недопустимый получатель из списка
  3. Установите настройки в DBMail повторные попыток до 0
0

У меня был таким же проблема дублирования при использовании ЗЕЬЕСТА в @query для отправки постоянного текста в теле каждого электронной почты, в дополнение к использованию @body и @subject для отправки пользовательского текста в зависимости от некоторого состояния.

В одном письме содержался как текст, так и текст запроса, как ожидалось. Дублированное письмо содержало только текст @query (без пользовательского текста) с вставленной в систему строкой темы «Сообщение SQL Server».

Я запустил SELECT * FROM msdb.dbo.sysmail_sentitems, и достаточно послано письмо было отправлено дважды.Взгляд на sysmail_configuration показал, что AccountRetryAttempts paramValue = 1.

Проблема исчезла после того, как я полностью удалил @query из хранимой процедуры (выполнил изменение), запустил sp. Затем я поставил @query обратно в sp, выполните изменения. После этого электронные письма начали отправлять только один раз. Идите фигуру.

0

Удостоверьтесь, что у вас нет каких-либо других операторов обновления в любых других триггерах в боковых триггерах при обновлении.

Даже я столкнулся с подобной проблемой, когда я перекрестился с моими триггерами. Я видел, что использовал другой оператор обновления в другом триггере. Это вызвало многократное срабатывание триггеров. Следовательно, две почты были вызваны.

Смежные вопросы