Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отправка сообщений sp_send_dbmail  [new]
Eugene.ev
Member

Откуда: Киев
Сообщений: 119
Доброе время суток, помогите в решении следующего вопроса.

Есть таблица в которую происходит запись данных по средством обычного Insert into. Может быть записана одна и более строк.
Задача очень проста результат insert into отправить на почту в виде обычного письма непосредственно сразу после записи.

При создании тригера AFTER INSERT происходит зависание процедуры.

EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail',
@recipients = 'test@test.com.ua',
@subject = 'TEST QUERY',
@query = 'SELECT * FROM test.dbo.Table_1'

Подскажите в чем может быть ньюанс и как все же добится желаемого результата.
19 ноя 09, 10:56    [7949093]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene.ev


При создании тригера AFTER INSERT происходит зависание процедуры.

EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail',
@recipients = 'test@test.com.ua',
@subject = 'TEST QUERY',
@query = 'SELECT * FROM test.dbo.Table_1'

Подскажите в чем может быть ньюанс и как все же добится желаемого результата.

Это не зависание. Это блокировка. Потому что вы из другого коннекта пытаетесь читать записи той же таблицы, для которой сработал ваш триггер. А эти записи будут блокированы, пока триггер не завершится
19 ноя 09, 10:59    [7949109]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Eugene.ev
Member

Откуда: Киев
Сообщений: 119
да я как бы понял что это блокировка, подскажите мне плыз, как решить эту задачу другими методами?
19 ноя 09, 11:09    [7949201]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene.ev
да я как бы понял что это блокировка, подскажите мне плыз, как решить эту задачу другими методами?

Использовать для оповещения Service Broker, например
19 ноя 09, 11:12    [7949222]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Eugene.ev
да я как бы понял что это блокировка, подскажите мне плыз, как решить эту задачу другими методами?

Использовать для оповещения Service Broker, например

sp_send_dbmail - это отправка почтового сообщения через службу Database Mail
А она и так спроектирована на основне технологий компонента Service Broker
Посмотрит объект Server Broker в базе MSDB - все нобходимые объекты (контракты, типы сообщений, очереди) для работы Database Mail там присутствуют.
С уважением, Алексей
19 ноя 09, 11:53    [7949630]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleksey-K
Glory
Eugene.ev
да я как бы понял что это блокировка, подскажите мне плыз, как решить эту задачу другими методами?

Использовать для оповещения Service Broker, например

sp_send_dbmail - это отправка почтового сообщения через службу Database Mail
А она и так спроектирована на основне технологий компонента Service Broker
Посмотрит объект Server Broker в базе MSDB - все нобходимые объекты (контракты, типы сообщений, очереди) для работы Database Mail там присутствуют.
С уважением, Алексей

Только вот Service Broker - это не одна процедура sp_send_dbmail. А немного больше.
19 ноя 09, 11:55    [7949651]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Aleksey-K
Glory
Eugene.ev
да я как бы понял что это блокировка, подскажите мне плыз, как решить эту задачу другими методами?

Использовать для оповещения Service Broker, например

sp_send_dbmail - это отправка почтового сообщения через службу Database Mail
А она и так спроектирована на основне технологий компонента Service Broker
Посмотрит объект Server Broker в базе MSDB - все нобходимые объекты (контракты, типы сообщений, очереди) для работы Database Mail там присутствуют.
С уважением, Алексей

Только вот Service Broker - это не одна процедура sp_send_dbmail. А немного больше.

И что! Главное - асинхроный принцип взаимодействия процессов.
В данном случае после отправки почты через sp_send_dbmail в триггере не будет ожидания завершения всей сессии SMTP, т.к. DatabaseMail.exe эту операцию прводит черес Service Broker. А зависание может происходить не в момент отправки, а при чтении из Table_1'. Может имеет смысл в данном запросе использовать хинт NOLOCK?
С уважением, Алексей.
19 ноя 09, 12:01    [7949704]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleksey-K

И что! Главное - асинхроный принцип взаимодействия процессов.
В данном случае после отправки почты через sp_send_dbmail в триггере не будет ожидания завершения всей сессии SMTP, т.к. DatabaseMail.exe эту операцию прводит черес Service Broker. А зависание может происходить не в момент отправки, а при чтении из Table_1'. Может имеет смысл в данном запросе использовать хинт NOLOCK?
С уважением, Алексей.

Ага, NOLOCK. И получить данные добавляемые из других коннектов ?
Вопрос не в асинхронности а как раз в правильной последовательности действия. Сначала завершить транзакцию, а потом уже отсылать данные о ней.
19 ноя 09, 12:06    [7949760]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Aleksey-K

И что! Главное - асинхроный принцип взаимодействия процессов.
В данном случае после отправки почты через sp_send_dbmail в триггере не будет ожидания завершения всей сессии SMTP, т.к. DatabaseMail.exe эту операцию прводит черес Service Broker. А зависание может происходить не в момент отправки, а при чтении из Table_1'. Может имеет смысл в данном запросе использовать хинт NOLOCK?
С уважением, Алексей.

Ага, NOLOCK. И получить данные добавляемые из других коннектов ?
Вопрос не в асинхронности а как раз в правильной последовательности действия. Сначала завершить транзакцию, а потом уже отсылать данные о ней.

Ладно, бог с ним, с запросом. Автору виднее, что ему читать и как.
У меня другой вопрос. Вы считаете, что запрос @query = 'SELECT * FROM test.dbo.Table_1' выполняется в триггере, где вызывается процедура sp_send_dbmail?
Мне казалось, что запрос должен выполнятся уже в DatabaseMail.exe, которая работает в асинхронном режиме под управлением Service Broker и не может вызывать задержку кода триггера из-за блокировок на таблицу test.dbo.Table_1. Или я не прав?
С уважением, Алексей
19 ноя 09, 13:13    [7950350]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleksey-K

У меня другой вопрос. Вы считаете, что запрос @query = 'SELECT * FROM test.dbo.Table_1' выполняется в триггере, где вызывается процедура sp_send_dbmail?
Мне казалось, что запрос должен выполнятся уже в DatabaseMail.exe, которая работает в асинхронном режиме под управлением Service Broker и не может вызывать задержку кода триггера из-за блокировок на таблицу test.dbo.Table_1. Или я не прав?
С уважением, Алексей

Так я об этом и написал "Потому что вы из другого коннекта пытаетесь читать записи той же таблицы, для которой сработал ваш триггер"
А вот почему вы решили, что sp_send_dbmail должна выполняться асинхронно, непонятно
19 ноя 09, 13:15    [7950372]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Aleksey-K

У меня другой вопрос. Вы считаете, что запрос @query = 'SELECT * FROM test.dbo.Table_1' выполняется в триггере, где вызывается процедура sp_send_dbmail?
Мне казалось, что запрос должен выполнятся уже в DatabaseMail.exe, которая работает в асинхронном режиме под управлением Service Broker и не может вызывать задержку кода триггера из-за блокировок на таблицу test.dbo.Table_1. Или я не прав?
С уважением, Алексей

Так я об этом и написал "Потому что вы из другого коннекта пытаетесь читать записи той же таблицы, для которой сработал ваш триггер"
А вот почему вы решили, что sp_send_dbmail должна выполняться асинхронно, непонятно

А из BOL:
Компонент Database Mail спроектирован по принципу очереди на основе технологий компонента Service Broker. Когда пользователь выполняет хранимую процедуру sp_send_dbmail, в почтовую очередь вставляется новый элемент и создается запись, содержащая сообщение электронной почты. При вставке новой записи в почтовую очередь запускается внешний процесс компонента Database Mail (DatabaseMail.exe). Внешний процесс считывает данные электронной почты и отправляет сообщение электронной почты соответствующему серверу или серверам электронной почты. Внешний процесс вставляет элемент в очередь состояния в соответствии с результатами операции отправки. При вставке новой записи в очередь состояний запускается внутренняя хранимая процедура, которая выполняет обновление состояния электронного сообщения. Кроме сохранения отправленного (или неотправленного) сообщения электронной почты, компонент Database Mail также записывает в системные таблицы все вложения. Представления компонента Database Mail содержат сведения о состоянии сообщений для диагностики и устранения неполадок в работе, а хранимые процедуры позволяют администрировать очередь компонента Database Mail.
Т.е. sp_send_dbmail вызывается не асинхронно, но она просто пишет запись в таблицу в msdb, а вот отправка почты из этой таблицы по smtp происходит асинхронно через Service Broker.
С уважением, Алексей

К сообщению приложен файл. Размер - 0Kb
19 ноя 09, 13:22    [7950437]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleksey-K

Т.е. sp_send_dbmail вызывается не асинхронно, но она просто пишет запись в таблицу в msdb, а вот отправка почты из этой таблицы по smtp происходит асинхронно через Service Broker.
С уважением, Алексей

Замечательно. И как же тогда автору темы использовать неасинхронную sp_send_dbmail в своем триггере то ?
19 ноя 09, 13:25    [7950474]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
tortoise
Member

Откуда: UK
Сообщений: 531
Eugene.ev,

создайте табличку того , что должно быть отправлено и создайте Job для рассылки из новой таблички
19 ноя 09, 13:29    [7950503]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
tortoise
Member

Откуда: UK
Сообщений: 531
tortoise
Eugene.ev,

создайте табличку того , что должно быть отправлено и создайте Job для рассылки из новой таблички


а собственно можно и без job, а из того же триггера после записи в новую таблицу
19 ноя 09, 13:32    [7950526]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Aleksey-K

Т.е. sp_send_dbmail вызывается не асинхронно, но она просто пишет запись в таблицу в msdb, а вот отправка почты из этой таблицы по smtp происходит асинхронно через Service Broker.
С уважением, Алексей

Замечательно. И как же тогда автору темы использовать неасинхронную sp_send_dbmail в своем триггере то ?

А ничего менять не надо. Судя по описанию работы Database Mail текст запроса только передается в системную таблицу, а сам запрос выполняется уже процессом DatabaseMail.exe вне тела триггера.
Зависание у автора топика происходит при СОЗДАНИИ триггера (При создании тригера AFTER INSERT происходит зависание процедуры)!
С уважением, Алексей
P.S. из BOL описание параметра @query хранимой процедуры sp_send_dbmail:
[ @query = ] 'query'
Запрос, подлежащий выполнению. Результаты запроса могут прикрепляться в виде файла или включаться в текст сообщения электронной почты. Запрос имеет тип nvarchar(max) и может содержать любые допустимые инструкции языка Transact-SQL. Заметьте, что запрос выполняется в отдельном сеансе, так что локальные переменные в сценарии, вызываемом процедурой sp_send_dbmail, недоступны для запроса
19 ноя 09, 13:35    [7950561]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleksey-K
Glory
Aleksey-K

Т.е. sp_send_dbmail вызывается не асинхронно, но она просто пишет запись в таблицу в msdb, а вот отправка почты из этой таблицы по smtp происходит асинхронно через Service Broker.
С уважением, Алексей

Замечательно. И как же тогда автору темы использовать неасинхронную sp_send_dbmail в своем триггере то ?

А ничего менять не надо. Судя по описанию работы Database Mail текст запроса только передается в системную таблицу, а сам запрос выполняется уже процессом DatabaseMail.exe вне тела триггера.
Зависание у автора топика происходит при СОЗДАНИИ триггера (При создании тригера AFTER INSERT происходит зависание процедуры)!

А при создании триггера разве происходит выполнение его тела ???
19 ноя 09, 13:40    [7950599]     Ответить | Цитировать Сообщить модератору
 Re: Отправка сообщений sp_send_dbmail  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Glory
Aleksey-K
Glory
Aleksey-K

Т.е. sp_send_dbmail вызывается не асинхронно, но она просто пишет запись в таблицу в msdb, а вот отправка почты из этой таблицы по smtp происходит асинхронно через Service Broker.
С уважением, Алексей

Замечательно. И как же тогда автору темы использовать неасинхронную sp_send_dbmail в своем триггере то ?

А ничего менять не надо. Судя по описанию работы Database Mail текст запроса только передается в системную таблицу, а сам запрос выполняется уже процессом DatabaseMail.exe вне тела триггера.
Зависание у автора топика происходит при СОЗДАНИИ триггера (При создании тригера AFTER INSERT происходит зависание процедуры)!

А при создании триггера разве происходит выполнение его тела ???

Да... все-таки надо спросить у автора, когда происходит зависание! Пусть приведет команду INSERT на которой происходит зависание. И как он определил, что виноват триггер. Хорошо бы и DDL на Table_1 глянуть. Может что еще там есть.
С уважением, Алексей
19 ноя 09, 13:45    [7950650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить