Erro ao executar SP_SEND_MAIL via JOB
No post de hoje vamos compartilhar o caso de um cliente que tem um job que manda um e-mail via SP_Send_Mail com o resultado de uma query no csv.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'MSSQLSERVER', @recipients = 'Teste@teste.com.br', @subject = 'Relatório', @body = 'Olá! <strong>Teste</strong>', @execute_query_database = 'BaseTeste', @body_format = 'html', @from_address = 'Teste@teste.com.br', @query = 'SET NOCOUNT ON; SELECT TOP 10 * FROM Tabela_Teste ', @query_attachment_filename = 'anexo.csv', @attach_query_result_as_file = 1, @query_result_header = 1, @query_result_width = 256, @query_result_separator = ' ', @query_result_no_padding = 1 |
Porém o job falhava com a seguinte mensagem:
“Failed to initialize sqlcmd library with error number -2147467259. [SQLSTATE 42000] (Error 22050). The step failed.”
Ao consultar a documentação da Microsoft ela informa que esse erro está na combinação dos seguintes parâmetros:
“The following error may occur when setting @querry_result_header to 0 and setting @querry_no_truncate to 1: Msg 22050, Level 16, State 1, Line 12: Failed to initialize sqlcmd library whith error number -21477024809”
O erro ocorre quando o parâmetro @query_result_header = 0 e o @query_no_truncate = 1. Mas o job estava fazendo exatamente o contrário @query_result_header = 1 e o @query_no_truncate = 0 (valor padrão quando não informado).
Portanto não era esse o problema.
Quando o comando do job era executado via ssms o erro não ocorria.
Fiz os testes na minha máquina e o job funcionou sem erros. Parti para verificar se o usuário que estava executando o job tinha os acessos necessários. No caso do cliente o usuário do serviço não existia no banco de dados, então criei o mesmo.
O acesso para execução da SP_Send_Mail é o acesso a ROLE DatabaseMailUserRole no MSDB. Concedi esse acesso ao usuário do serviço, porém o erro persistia.
1 2 3 4 5 6 7 8 |
USE [msdb] GO CREATE USER [Teste] FOR LOGIN [Teste] GO USE [msdb] GO ALTER ROLE [DatabaseMailUserRole] ADD MEMBER [Teste] GO |
Concedi esse acesso ao usuário do serviço, porém o erro persistia.
Criei então um profile para capturar os erros que ocorriam ao executar o job e foi assim que peguei que o erro era a falta de acesso à base onde o select estava sendo executado e não tinha nada a ver com a msg de erro do job.
Acesso de leitura concedida na base do select e erro resolvido.
1 2 3 4 5 6 7 8 |
USE [BaseTeste] GO CREATE USER [Teste] FOR LOGIN [Teste] GO USE [BaseTeste] GO ALTER ROLE [db_datareader] ADD MEMBER [Teste] GO |