Не удалось выполнить msdb.dbo.sp_send_dbmail
Я получаю эту ошибку:
Msg 229, уровень 14, состояние 5, процедура sp_send_dbmail, строка 1
Разрешение EXECUTE было отклонено на объект "sp_send_dbmail", базу данных "msdb", схему "dbo".
Соответствующая часть кода:
/****** Object: StoredProcedure [dbo].[dbo.STATUSCHANGE_EMAILALERT] ******/
EXEC msdb.dbo.sp_send_dbmail
@recipients = '[email protected]', -- Group Email
@subject = 'Employee Status Update',
@profile_name ='[email protected]', -- Setup the profile name group
@body = @body,
@body_format = 'HTML';
Ответы
Ответ 1
Нашел хорошее и простое исправление, которое помогло мне здесь:
Если ваши приложения SQL не могут отправлять электронную почту, используя почту базы данных (я предполагаю, что у вас уже есть настройки учетной записи и профиля DBMail), необходимо установить две вещи:
- СТУДИЯ УПРАВЛЕНИЯ SQL> УПРАВЛЕНИЕ> ПОЧТА БАЗЫ ДАННЫХ> щелкните правой кнопкой мыши и
выберите КОНФИГУРАЦИЯ…> выберите УПРАВЛЕНИЕ БЕЗОПАСНОСТЬЮ ПРОФИЛЯ> УПРАВЛЕНИЕ SQL
- поставить галочку на опцию PUBLIC
- щелкните ПРОФИЛЬ ПО УМОЛЧАНИЮ и установите для него значение ДА
- СТУДИЯ> Базы данных> Системные базы данных> щелкните правой кнопкой мыши на MSDB и
выберите NEW QUERY>, затем введите> Предоставить выполнение sp_send_dbmail для
общедоступный и нажмите ОК
Ответ 2
Чтобы отправить почту базы данных, пользователи должны быть пользователями в базе данных msdb и членом роли базы данных DatabaseMailUserRole
в базе данных msdb. Чтобы добавить пользователей или группы msdb к этой роли, используйте SQL Server Management Studio или выполните следующую инструкцию для пользователя или роли, которая должна отправить почту базы данных:
EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
,@membername = '<user or role name>';
GO
Ответ 3
Предоставить разрешение на выполнение sp_send_dbmail
для пользователя, выполняющего хранимую процедуру, или добавить их в роль msdb.DatabaseMailUser
.
Ответ 4
Хорошо, просто чтобы добавить к этой теме, так как это была действительно хорошая информация, но все еще не полностью решила мою проблему. Если я выполнял запрос в SSMS, он работал, как только мне было предоставлено разрешение на выполнение процедуры sp_send_dbmail в msdb. Однако, когда задание выполнялось от имени моего пользователя, оно все равно не получалось.
Прочитайте много материала, чтобы прийти к выводу, что вам нужно убедиться, что sid для владельца в вашей БД совпадает с sid владельца в основной БД:
--To get owner SID recorded in the master database for the current database
SELECT owner_sid FROM sys.databases WHERE database_id=DB_ID()
--To get the owner SID recorded for the current database owner
SELECT sid FROM sys.database_principals WHERE name=N'dbo'
Несмотря на то, что я предоставил доступ к базе данных msdb и правам на выполнение sp_send_dbmail, у нее все еще были проблемы, связанные с ненадежностью базы данных и несоответствием sids владельца. Следовательно, мне пришлось включить в Trustworthy базу данных, в которой я работал, и исправить проблему владения:
ALTER DATABASE my_db SET TRUSTWORTHY ON;
ALTER AUTHORIZATION ON Database::my_db TO [domain\user];
Мне пришлось много разгуливать, чтобы наконец найти эту рецензию, которая гораздо более поучительна.