msdb.dbo.sp_send_dbmail не выполняется в хранимой процедуре - PullRequest
3 голосов
/ 24 августа 2011

Я использовал следующий код для настройки мониторинга взаимоблокировок:

http://weblogs.sqlteam.com/mladenp/archive/2008/07/18/Immediate-deadlock-notifications-without-changing-existing-code.aspx

, и он отлично работает.У меня проблема в том, что msdb.dbo.sp_send_dbmail, похоже, не работает.Если я выполняю вручную из сеанса, Он работает нормально , но из хранимой процедуры возникает следующая ошибка:

2011-08-23 16: 42: 45.28 spid219s Активированный процесс[dbo]. [usp_ProcessNotification], работающий в очереди Wayne.dbo.DeadLockNotificationsQueue, выдает следующее: 'Ошибка при получении сообщения компонента Service Broker из очереди DeadLockNotificationsQueue.Имя базы данных: Уэйн;Номер ошибки: 229;Сообщение об ошибке: Отказано в разрешении EXECUTE для объекта 'sp_send_dbmail', базы данных 'msdb', схемы 'dbo'. '

Я также выполнил следующее:

EXEC msdb.dbo.sp_addrolemember@rolename = 'DatabaseMailUserRole', @ membername = '';

с моим входом в систему в качестве имени члена, но, похоже, это не поможет.

Что мне нужно сделать, чтобы исправить это?

Спасибо.

Уэйн.

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Мартин указал на правильную причину, контекст EXECUTE AS, в котором запускается ваша активированная процедура. Вы можете использовать подпись кода для предоставления необходимых разрешений, как показано в Вызов процедуры из другой базы данных из активированной процедуры . Или вы можете просто пометить базу данных Wayne , заслуживающую доверия :

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;

Первый метод сложен, но обязателен в безопасной среде. Последний способ намного проще, но он подразумевает, что dbo базы данных Wayne может перейти к привилегиям sysadmin. Если проблема безопасности не имеет значения, вы можете использовать более простой подход TRUSTWORTHY.,

1 голос
/ 01 декабря 2012

Вы можете создать процедуру в msdb, которая вызывает sp_send_dbmail, а затем разрешить выполнение public для вызывающей процедуры, как предложено gbn: Как выполнить sp_send_dbmail при ограничении разрешений . Для запуска процедуры необязательно добавлять пользователей в msdb. Очевидно, что это позволяет любому отправлять почту с соблюдением процедурной логики.

...