Symptômes
Supposons qu’un utilisateur qui exécute Microsoft SQL Server ne peut pas envoyer de courrier de la base de données. Dans ce cas, le journal de la messagerie de base de données (sysmail_event_log) affiche l’entrée suivante :
Informations sur les exceptions :
Type d’exception : Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException : La Transaction de message N’est plus valide. Données : System.Collections.ListDictionaryInternal Site cible : Void ValidateConnectionAndTransaction() HelpLink : NULL Source : DatabaseMailEngine
Informations de suivi de pile :
à Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction() à Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction() à Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue (DataAccessAdapter da, lifetimeMinimumSec de Int32) à Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems (String dbName, NomServeurBD de chaîne, Int32 lifetimeMinimumSec, LogLevel loggingLevel, Byte [] encryptionKey, Int32 connectionTimeout) », @proc
Remarques
-
L’expression « n’est plus valide » apparaît ainsi dans le champ Message signifient que la transaction « n’est plus valide. »
-
Vous pouvez voir le même message dans le journal d’Application. Le message électronique reste dans l’état « Réessayer » sysmail_unsentitems et reste en attente jusqu'à ce que le programme externe DatabaseMail.exe pouvez exécuter avec succès.
Cause
L’option de connexion par défaut de SQL Server utilise SET des ON NUMERIC_ARITHABORT. Lorsque vous exécutez sp_send_dbmail, le message est en file d’attente à ExternalMailQueue. Lorsqu’un message apparaît dans la file d’attente, l’activation stockées déclencheurs de procédure l’exécutable externe DatabaseMail.exe. Lorsque DatabaseMail.exe est connecté à SQL Server, il exécute sp_readrequest pour lire les messages de la file d’attente. Lors de l’exécution de sp_readrequest, vous pouvez remarquer que l’exception se produit.
L’instruction SELECT suivante est exécutée dans les sp_readrequest (vous devez collecter le traçage au niveau de l’instruction pour voir cette instruction SELECT) :
DatabaseMail - DatabaseMail - Id < ProcessId >< NTUserName >< SPID >< StartTime > msdb < LoginSid >< SessionLoginName > : protocole réseau : TCP/IP Définir quoted_identifier sur Définir arithabort off définir numeric_roundabort sur Définir ansi_warnings sur Set ansi_padding sur set ansi_nulls sur concat_null_yields_null ensemble sur cursor_close_on_commit jeu hors tension Set implicit_transactions off Set language us_english Set dateformat MJA Set datefirst 7 définir le niveau d’isolation des transactions lecture validé 2 - pool 1 1 - Non-DAC
RPC : démarrage < 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 >
@Mailitem_id SELECT = MailRequest.Properties.value('(MailItemId) [1]', 'int') À partir de @xmlblob.nodes (' déclarer des demandes d’espace de noms = «http://schemas.microsoft.com/databasemail/requests» ; / requêtes : SendMail') En tant que MailRequest(Properties)
Si SET des ON NUMERIC_ARITHABORT est défini en tant qu’option de connexion par défaut, cette instruction SELECT 1934 d’erreur et une exception est levée :
Exception 4 < nom_serveur > DatabaseMail - DatabaseMail - Id < ProcessId >< NTUserName >< SPID >< StartTime > 1934 msdb < LoginSid >< SessionLoginName > SELECT a échoué car les options SET suivantes des paramètres incorrects : « NUMERIC_ROUNDABORT ». Vérifiez que les options SET sont correctes pour une utilisation avec les vues indexées et/ou les index sur les colonnes calculées et/ou index filtrés et/ou les notifications de requête et/ou les méthodes de type de données XML spatialindex opérations.
Lorsque DatabaseMail.exe rencontre l’exception, une restauration est essayée, mais échoue. L’exception entraîne hors de portée de la transaction. Pour cette raison, un message « transaction n’est plus valide » est enregistré dans le journal de la messagerie de base de données.
Toutefois, la cause du problème est que 1934 d’erreur se produit en raison d’une option de jeu incompatible lors de la méthode de type de données XML (MailRequest.Properties.value('(MailItemId) [1]', 'int')) est utilisé dans l’instruction SELECT.
Comment faire pour vérifier le message d’erreur
-
Vérifiez si le message d’erreur dans le journal de la messagerie de base de données est le même message (« la Transaction n’est plus valide »).
-
Rassembler une trace du Générateur de profils en demandant des événements au niveau de l’instruction, des erreurs et des avertissements et Broker événements activés.
-
Vérifiez le paramètre d’instance SQL Server pour les options de connexion par défaut. Pour ce faire, ouvrez SQL Server Management Studio, cliquez droit sur le serveuret puis sélectionnez Propriétés > connexions > options de connexion par défaut > abandon d’arrondi numérique.
Résolution
Pour résoudre ce problème, modifiez l’option de connexion par défaut de SET NUMERIC_ROUNDABORT OFF.
Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.
Références
Obtenir des informations sur la terminologieque Microsoft utilise pour décrire les mises à jour logicielles.