Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo le ayuda a resolver el problema en el que el correo electrónico de base de datos no puede enviar un mensaje.
Versión original del producto: SQL Server 2012, SQL Server 2014, SQL Server 2016, SQL Server 2017 en Linux, SQL Server 2017 en Windows
Número de KB original: 4502457
Síntomas
Supongamos que un usuario que ejecuta Microsoft SQL Server no puede enviar Correo electrónico de base de datos. En esta situación, el registro de correo electrónico de base de datos (sysmail_event_log) muestra la entrada siguiente:
Información de excepción: Tipo de excepción: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Mensaje: La transacción ya no es válida.
Datos: System.Collections.ListDictionaryInternal
TargetSite: Void ValidateConnectionAndTransaction()
HelpLink: NULL
Origen: DatabaseMailEngine
Información de StackTrace: en Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
en Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue(DataAccessAdapter da, Int32 lifetimeMinimumSec)
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel, Byte[] encryptionKey, Int32 connectionTimeout)',@proc
Nota:
- La frase ya no válida aparece de esta manera en el campo Mensaje para indicar que la transacción ya no es válida.
- Es posible que vea el mismo mensaje en el registro de la aplicación. El mensaje de correo permanecerá en estado de "reintento" en
sysmail_unsentitemsy permanecerá sin enviar hasta que el programa externo de DatabaseMail.exe pueda ejecutarse correctamente.
Causa
La opción de conexión predeterminada de SQL Server usa SET NUMERIC_ARITHABORT ON. Cuando se ejecuta sp_send_dbmail, el mensaje de correo se pone en cola en ExternalMailQueue. Cuando aparece un mensaje en la cola, el procedimiento almacenado de activación desencadena el DatabaseMail.exe ejecutable externo. Cuando DatabaseMail.exe está conectado a SQL Server, se ejecuta sp_readrequest para leer mensajes de la cola. Durante la ejecución de sp_readrequest, puede observar que se produce la excepción.
La instrucción siguiente SELECT se ejecuta en sp_readrequest (tiene que recopilar el seguimiento de nivel de instrucción para ver esta SELECT instrucción):
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.
Cuando DatabaseMail.exe encuentra la excepción, se prueba una reversión, pero se produce un error. La excepción hace que la transacción salga del ámbito. Por este motivo, una transacción ya no válida se registra en el registro de Correo electrónico de base de datos.
Sin embargo, la causa principal del problema es que el error 1934 se produce debido a una opción SET incompatible cuando se usa el método de tipo de datos XML (MailRequest.Properties.value('(MailItemId)[1]', 'int')) en la SELECT instrucción .
Comprobación del mensaje de error
Compruebe si el mensaje de error del registro de Correo electrónico de base de datos es el mismo mensaje (la transacción ya no es válida).
Recopile un seguimiento del generador de perfiles con eventos de nivel de instrucción, errores y advertencias y eventos de Broker habilitados.
Compruebe la configuración de la instancia de SQL Server para ver las opciones de conexión predeterminadas. Para ello, abra SQL Server Management Studio, haga clic con el botón derecho en Servidor y, a continuación, seleccione Propiedades Opciones de>conexión predeterminadas>opciones>de conexión numéricas anulación de redondeo.
Solución
Para resolver este problema, cambie la opción de conexión predeterminada a SET NUMERIC_ROUNDABORT OFF.