Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo ajuda a resolver o problema em que o Database Mail falha ao enviar uma mensagem.
Versão original do produto: SQL Server 2012, SQL Server 2014, SQL Server 2016, SQL Server 2017 no Linux, SQL Server 2017 no Windows
Número original do KB: 4502457
Sintomas
Suponha que um usuário que esteja executando o Microsoft SQL Server não possa enviar o Database Mail. Nessa situação, o log de e-mail do banco de dados (sysmail_event_log) mostra a seguinte entrada:
Informações sobre exceções: Tipo de exceção: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Mensagem: A transação não é mais válida.
Dados: System.Collections.ListDictionaryInternal
TargetSite: Void ValidateConnectionAndTransaction()
AjudaLink: NULL
Fonte: DatabaseMailEngine
Informações do StackTrace: em Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
em Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
em Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue (DataAccessAdapter da, Int32 lifetimeMinimumSec)
em Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel, Byte[] encryptionKey, Int32 connectionTimeout)',@proc
Observação
- A frase não é mais válida aparece dessa forma no campo Mensagem para significar que a transação não é mais válida.
- Você pode ver a mesma mensagem no log do aplicativo. A mensagem de e-mail permanecerá no estado "repetir" no
sysmail_unsentitemse não será enviada até que o DatabaseMail.exe programa externo possa ser executado com êxito.
Causa
A opção de conexão padrão do SQL Server usa SET NUMERIC_ARITHABORT ON. Quando você executa sp_send_dbmailo , a mensagem de email é enfileirada em ExternalMailQueue. Quando uma mensagem aparece na fila, o procedimento armazenado de ativação dispara o DatabaseMail.exe executável externo. Quando DatabaseMail.exe está conectado ao SQL Server, ele é executado sp_readrequest para ler mensagens da fila. Durante a execução do sp_readrequest, você pode notar que a exceção ocorre.
A instrução a seguir SELECT é executada ( sp_readrequest você precisa coletar o rastreamento no nível da instrução para ver essa SELECT instrução):
DatabaseMail - DatabaseMail - Id\<ProcessId> \<NTUserName> \<SPID> \<StartTime> msdb \<LoginSid> \<SessionLoginName>
-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort on
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
2 - Pooled 1 1 - Non-DAC
RPC:Starting <BinaryData> 4 <NTUserName> DatabaseMail - DatabaseMail - Id<ProcessId> <NTUserName> <SPID> <StartTime> sp_readrequest msdb <LoginSid> <SessionLoginName> exec sp_readrequest @receive_timeout=600000
SP:StmtStarting <BinaryData> 4 <NTUserName> DatabaseMail - DatabaseMail - Id<ProcessId> <NTUserName> <SPID> <StartTime> sp_readrequest msdb <LoginSid> <SessionLoginName>
SELECT @mailitem_id = MailRequest.Properties.value('(MailItemId)[1]', 'int')
FROM @xmlblob.nodes('
declare namespace requests="https://schemas.microsoft.com/databasemail/requests]";/requests:SendMail')
AS MailRequest(Properties)
If SET NUMERIC_ARITHABORT ON is set as default connection option, this SELECT statement will encounter error 1934 and an exception will occur:
Exception 4 <servername> DatabaseMail - DatabaseMail - Id<ProcessId> <NTUserName> <SPID> <StartTime> 1934 msdb <LoginSid> <SessionLoginName> SELECT failed because the following SET options have incorrect settings:
'NUMERIC_ROUNDABORT'.
Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatialindex operations.
Quando DatabaseMail.exe encontra a exceção, uma reversão é tentada, mas falha. A exceção faz com que a transação saia do escopo. Por esse motivo, uma mensagem de transação não mais válida é registrada no log do Database Mail.
No entanto, a causa raiz do problema é que o erro 1934 ocorre devido a uma opção SET incompatível quando o método de tipo de dados XML (MailRequest.Properties.value('(MailItemId)[1]', 'int')) é usado na SELECT instrução.
Verificar a mensagem de erro
Verifique se a mensagem de erro no log do Database Mail é a mesma mensagem (A transação não é mais válida).
Reúna um rastreamento do criador de perfil tendo eventos no nível da instrução, erros e avisos e eventos do agente habilitados.
Verifique a configuração da instância do SQL Server para obter as opções de conexão padrão. Para fazer isso, abra o SQL Server Management Studio, clique com o botão direito do mouse em Servidor e selecione Propriedades>Conexões>Opções>de conexão padrão anulação de rodada numérica.
Solução
Para resolver esse problema, altere a opção de conexão padrão para SET NUMERIC_ROUNDABORT OFF.