Не удалось выполнить 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), необходимо установить две вещи:

  1. СТУДИЯ УПРАВЛЕНИЯ SQL> УПРАВЛЕНИЕ> ПОЧТА БАЗЫ ДАННЫХ> щелкните правой кнопкой мыши и выберите КОНФИГУРАЦИЯ…> выберите УПРАВЛЕНИЕ БЕЗОПАСНОСТЬЮ ПРОФИЛЯ> УПРАВЛЕНИЕ SQL
  2. поставить галочку на опцию PUBLIC
  3. щелкните ПРОФИЛЬ ПО УМОЛЧАНИЮ и установите для него значение ДА
  4. СТУДИЯ> Базы данных> Системные базы данных> щелкните правой кнопкой мыши на 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];

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