Erros comuns com o Database Mail

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

Este artigo descreve alguns erros comuns encontrados no Database Mail e suas soluções.

Não foi possível localizar o procedimento armazenado 'sp_send_dbmail'

O procedimento armazenado sp_send_dbmail é instalado no banco de dados msdb. Você deve executar sp_send_dbmail do banco de dados msdb ou especificar um nome de três partes para o procedimento armazenado.

Exemplo:

EXEC msdb.dbo.sp_send_dbmail ...

Ou:

USE msdb;
GO
EXEC dbo.sp_send_dbmail ...

Use o Assistente de Configuração do Database Mail para habilitar e configurar o Database Mail.

O perfil não é válido

Há duas causas possíveis para essa mensagem. Ou o perfil especificado não existe ou o usuário que está executando sp_send_dbmail (Transact-SQL) não tem permissão para acessar o perfil.

Para verificar permissões para um perfil, execute o procedimento armazenado sysmail_help_principalprofile_sp (Transact-SQL) com o nome do perfil. Use o procedimento armazenado sysmail_add_principalprofile_sp (Transact-SQL) ou o Assistente de Configuração do Database Mail para permitir um usuário do msdb ou grupo acessar um perfil.

Permissão negada em sp_send_dbmail

Este tópico descreve como solucionar o problema de uma mensagem de erro que afirma que o usuário que está tentando enviar Database Mail não tem permissão para executar sp_send_dbmail.

O texto do erro é:

EXECUTE permission denied on object 'sp_send_dbmail', 
database 'msdb', schema 'dbo'.

Para enviar Database Mail, é necessário ser um usuário do banco de dados msdb e membro da função de banco de dados DatabaseMailUserRole no banco de dados msdb. Para adicionar usuários ou grupos do msdb a essa função, use o SQL Server Management Studio ou execute a instrução a seguir para o usuário ou função que precisa enviar Database Mail.

EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<user or role name>';
GO

Para obter mais informações, veja sp_addrolemember e sp_droprolemember.

Database Mail colocado na fila, nenhuma entrada em sysmail_event_log ou no log de eventos de aplicativos do Windows

O Database Mail depende do Service Broker para enfileiramento de mensagens de email. Se o Database Mail for interrompido ou se a entrega de mensagens do Service Broker não estiver ativada no banco de dados msdb, o Database Mail formará a fila do banco de dados de mensagens, mas não conseguirá entregar as mensagens. Nesse caso, as mensagens do Service Broker permanecem na fila de email do Service Broker. O Service Broker não ativará o programa externo e, logo, não haverá entradas de log em sysmail_event_log, nem atualizações do status do item em sysmail_allitems e nas exibições relacionadas.

Execute a seguinte instrução para verificar se o Service Broker está habilitado no banco de dados msdb:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';

Um valor de 0 indica que a entrega de mensagens do Service Broker não está ativada no banco de dados msdb. Para corrigir o problema, ative o Service Broker no banco de dados com o seguinte comando Transact-SQL:

USE master ;
GO

ALTER DATABASE msdb SET ENABLE_BROKER ;
GO

O Database Mail depende de uma série de procedimentos armazenados internos. Para reduzir a área de superfície, esses procedimentos armazenados encontram-se desabilitados em novas instalações do SQL Server. Para habilitar esses procedimentos armazenados, use a opção Database Mail XPs do procedimento armazenado do sistema sp_configure, como no exemplo a seguir:

EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1;  
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO  

O Database Mail pode ser interrompido no banco de dados msdb. Para verificar o status do Database Mail, execute o seguinte comando:

EXECUTE dbo.sysmail_help_status_sp;

Para iniciar o Database Mail em um banco de dados host de correio, execute o seguinte comando no banco de dados msdb:

EXECUTE dbo.sysmail_start_sp;

O Service Broker examina o tempo de vida da caixa de diálogo das mensagens quando se encontra ativado; portanto, toda mensagem que estiver na fila de transmissão do Service Broker por mais tempo que o tempo de vida configurado para a caixa de diálogo falhará imediatamente. O Database Mail atualiza o status de mensagens que falharam em sysmail_allitems e em exibições relacionadas. Você deve decidir se as mensagens devem ou não ser enviadas novamente. Para obter mais informações sobre como configurar o tempo de vida do diálogo utilizado pelo Database Mail, veja sysmail_configure_sp (Transact-SQL).

Confira também