Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 sp_send_dbmail в триггере (SQL 2005)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Для рассылки уведомлений юзерам из триггера используется sp_send_dbmail.

Если я редактирую табличку с правами юзера включенного в DatabaseMailUserRole, то все работает нормально.

Однако если программа работает под логином юзера не включенного в DatabaseMailUserRole или под Application Role - как тут быть? То бишь как сделать чтобы триггер отправлял письмо независимо от того какой пользователь изменяет таблицу?
5 май 06, 17:23    [2636429]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
В BOL четко написано, что
BOL
Execute permissions for sp_send_dbmail default to all members of the DatabaseMailUser database role in the msdb database. However, when the user sending the message does not have permission to use the profile for the request, sp_send_dbmail returns an error and does not send the message.

Соответственно - включайте в роль.
5 май 06, 17:27    [2636456]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Гавриленко Сергей Алексеевич
В BOL четко написано, что
BOL
Execute permissions for sp_send_dbmail default to all members of the DatabaseMailUser database role in the msdb database. However, when the user sending the message does not have permission to use the profile for the request, sp_send_dbmail returns an error and does not send the message.

Соответственно - включайте в роль.


Да не могу я включить - с Application Role (а программа выполняется под ней) это похоже просто не возможно!
5 май 06, 17:30    [2636480]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Как вариант - почитать про EXECUTE AS.
5 май 06, 17:31    [2636482]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Гавриленко Сергей Алексеевич
Как вариант - почитать про EXECUTE AS.


Читал, пробовал, но напрочь не выходит.
Пробовал:

EXECUTE AS LOGIN='MyMailLogin'
msdb.dbo.sp_send_dbmail ...
REVERT
и

EXECUTE msdb.dbo.sp_send_dbmail ... AS LOGIN='MyMailLogin'

когда юзер пытается апдейтить таблицу то триггер ругается:

автор
Cannot execute as the database principial because the principial "MyMailLogin" does not exists, this type of principial cannot be impresonated, or you do not have permission.
5 май 06, 17:43    [2636533]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
AndreyF
Для рассылки уведомлений юзерам из триггера используется sp_send_dbmail.


а алерты - не?

а то попутный ветер, флаг, барабан и горн плачут по таким техническим приемам...
5 май 06, 18:25    [2636683]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
AndrF
Member

Откуда:
Сообщений: 2195
Crimean
а алерты - не?


И как? Мне нужно сформировать текст сообщения, определить каким юзерам оно должно быть разослано - в триггере я все это спокойно сделаю, а с алертом - даже не представляю...

Crimean
а то попутный ветер, флаг, барабан и горн плачут по таким техническим приемам...


Ну поясни как надо, если есть что сказать, - для того и спрашиваю, чтобы разобраться.
6 май 06, 01:12    [2637614]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
AndrF
Ну поясни как надо


триггер - это такая штука, которая должна выполниться максимально быстро
из этого следует что 100% кода триггера должно быть контролируемо
ввод в тело триггера кода, который обращается к другим модулям, а, тем более, за пределы SQL Server, делает выполнение триггера непредсказуемым по времени, а, значит, и нестабильной и склонной к труднообнаруживаемым провисаниям всю систему
отсюда следствие - в триггере только логируем события
после, отдельным процессом, вне транзакции модификации данных, сканим залогированные события и оповещаем кого угодно и как угодно. такой способ обработки, при внешней громоздкости, очень стабилен под нагрузкой и нечуствителен (до определенных пределов) к перегрузам сервера
6 май 06, 11:34    [2638627]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
AndreyF
Member

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


Как вариант я об этом вначале думал, но все-же, как я понимаю, sp_send_dbmail собственно и не занимается отправкой - она просто ставит письмо в очередь на отправку. А уже сам сервер на досуге его отправляет. То бишь работает все быстро и нам не нужно ничего логировать и сканить - все это делает сам SQL Server.
---

Пока свою проблему решил тем что вместо Application Role создал юзера со всеми нужными правами (в том числе и на отправку почты) - в таком виде все работает...
6 май 06, 11:47    [2638698]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
AndreyF
она просто ставит письмо в очередь на отправку


да? а в куда? если в почтовик, то читаем всю ветку сначала. я не думаю, что в таблицу. хотя, даже если в таблицу в другой базе - читаем ветку сначала. и много думаем насчет "контролируемости кода"
6 май 06, 12:38    [2638977]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Crimean
AndreyF
она просто ставит письмо в очередь на отправку


да? а в куда? если в почтовик, то читаем всю ветку сначала. я не думаю, что в таблицу. хотя, даже если в таблицу в другой базе - читаем ветку сначала. и много думаем насчет "контролируемости кода"


Да нет, в очередь на отправку на самом SQL-сервере.
MS даже пишет что помещено в очередь при выполнении скрипта.
Таблички очереди и лога на SQL-сервере должны быть доступны - но конкретно с ними не разбирался.
6 май 06, 12:44    [2639012]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Простите что поднимаю тему, а как действительно из триггера послать письмо, с выборкой? Без выборки ( =без параметра @query) шлётся отлично, с выборкой никак... права в DatabaseMailUserRole даны, запускаю отправку как от себя EXECUTE AS LOGIN='DOMEN\User111'...
29 май 13, 16:22    [14365632]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
f50
с выборкой никак...

"Никак" - это сообщение об ошибке ?

f50
права в DatabaseMailUserRole даны, запускаю отправку как от себя EXECUTE AS LOGIN='DOMEN\User111'...

А выборка небось из той же таблицы, для которой сработал триггер с sp_send_dbmail ? И выбираеются как раз те записи, что затрагивает триггер ?
29 май 13, 16:26    [14365662]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
"Никак" - это значит при выполнении запроса по вставке записи (на табл. навешен тригер с отправкой письма с выборкой), часы начинают вращатся бесконечно, жмешь кнопку "стоп" - реакции нет. Снимаешь процесс в "Мониторе активности" - "Процессы". Т.е. ошибки вообще нет никакой.

Далее, выборка из соседней таблицы, простейшая, не из этой таблицы! В процессах как раз эта выборка и висит, в столбике "Команда".
30 май 13, 08:27    [14367863]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
aleks2
Guest
f50
"Никак" - это значит при выполнении запроса по вставке записи (на табл. навешен тригер с отправкой письма с выборкой), часы начинают вращатся бесконечно, жмешь кнопку "стоп" - реакции нет. Снимаешь процесс в "Мониторе активности" - "Процессы". Т.е. ошибки вообще нет никакой.

Далее, выборка из соседней таблицы, простейшая, не из этой таблицы! В процессах как раз эта выборка и висит, в столбике "Команда".


1. Уж сколько раз твердили миру: не пей из лужи - козленочком станешь.
Не выполняй в триггере "внешних/лишних" операций и минуют тебя геморрой и печали.

2. Ну запихните в триггере фсе, что вы желаете "послать", в доп. таблицу. Обработайте эту таблицу в асинхронном задании SQL Server Agent.
30 май 13, 08:40    [14367911]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
f50
"Никак" - это значит при выполнении запроса по вставке записи (на табл. навешен тригер с отправкой письма с выборкой), часы начинают вращатся бесконечно, жмешь кнопку "стоп" - реакции нет. Снимаешь процесс в "Мониторе активности" - "Процессы". Т.е. ошибки вообще нет никакой.

Это значит, "я не знаю, что происходит при выполнении моего @query"
30 май 13, 09:24    [14368112]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Сделал асинхронно в джобе. Теперь счастье :)
30 май 13, 11:40    [14368946]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Santa89
Member

Откуда:
Сообщений: 1508
f50, расскажите что значит асинхронно??
У вас триггер запускает Джоб ?? Или Джоб каждую минуту таблицы сканирует??
Ведь в идеале нужно так - табличка изменилась - сообщение(уведомление) через полминуты отослалось!
У меня такая же проблема, и сейчас триггер корячиться и отправляет почту.....
30 май 13, 12:39    [14369444]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Santa89
f50, расскажите что значит асинхронно??
У вас триггер запускает Джоб ?? Или Джоб каждую минуту таблицы сканирует??
Ведь в идеале нужно так - табличка изменилась - сообщение(уведомление) через полминуты отослалось!
У меня такая же проблема, и сейчас триггер корячиться и отправляет почту.....

Конечно джоб вызывается из триггера и письма уходят с выборкой без проблем.
30 май 13, 18:33    [14372149]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Santa89
Member

Откуда:
Сообщений: 1508
Другое дело!)
Не подскажете как вызвать джоб скриптом ??
30 май 13, 18:50    [14372224]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Santa89
как вызвать джоб скриптом ??

exec msdb.dbo.sp_start_job @job_name = N'Имя'
30 май 13, 18:58    [14372248]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
aleks2
Guest
f50
Santa89
f50, расскажите что значит асинхронно??
У вас триггер запускает Джоб ?? Или Джоб каждую минуту таблицы сканирует??
Ведь в идеале нужно так - табличка изменилась - сообщение(уведомление) через полминуты отослалось!
У меня такая же проблема, и сейчас триггер корячиться и отправляет почту.....

Конечно джоб вызывается из триггера и письма уходят с выборкой без проблем.


Да уж, просветление оказалось ложным.

Как легко, оказывается опошлить правильную идею.
30 май 13, 20:02    [14372461]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
Santa89
Member

Откуда:
Сообщений: 1508
aleks2, не будте голословными, что не так ?
31 май 13, 03:30    [14373257]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Алекс, а как по уму сделать отправку письма при событии на тригере?
Или по шире вопрос - как асинхронно запускать задания из тригера?
31 май 13, 13:22    [14375457]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_dbmail в триггере (SQL 2005)  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
f50, Santa89,

Вы в курсе, что джоб нельзя запустить повторно, пока он не отработал? Если в курсе, то представьте себе, что триггер выполняется слишком часто или одновременно в нескольких сеансах.
31 май 13, 13:52    [14375685]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить