Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit artikel helpt u bij het oplossen van het probleem waarbij database-e-mail een bericht niet kan verzenden.
Oorspronkelijke productversie: SQL Server 2012, SQL Server 2014, SQL Server 2016, SQL Server 2017 op Linux, SQL Server 2017 op Windows
Oorspronkelijk KB-nummer: 4502457
Symptomen
Stel dat een gebruiker met Microsoft SQL Server database-e-mail niet kan verzenden. In dit geval wordt in het database-e-maillogboek (sysmail_event_log) het volgende item weergegeven:
Uitzonderingsinformatie: Uitzonderingstype: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Bericht: De transactie is niet langer geldig.
Gegevens: System.Collections.ListDictionaryInternal
TargetSite: Void ValidateConnectionAndTransaction()
HelpLink: NULL
Bron: DatabaseMailEngine
StackTrace Information: at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
at 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
Notitie
- De woordgroep die niet langer geldig is, wordt op deze manier weergegeven in het veld Bericht , zodat de transactie niet meer geldig is.
- Mogelijk ziet u hetzelfde bericht in het toepassingslogboek. Het e-mailbericht blijft de status
sysmail_unsentitemsOpnieuw proberen en blijft ongewijzigd totdat het DatabaseMail.exe extern programma kan worden uitgevoerd.
Oorzaak
De standaardverbindingsoptie van SQL Server maakt gebruik van SET NUMERIC_ARITHABORT ON. Wanneer u het uitvoert sp_send_dbmail, wordt het e-mailbericht in de wachtrij geplaatst bij ExternalMailQueue. Wanneer er een bericht in de wachtrij wordt weergegeven, activeert de opgeslagen activeringsprocedure het DatabaseMail.exe extern uitvoerbaar bestand. Wanneer DatabaseMail.exe is verbonden met SQL Server, wordt deze uitgevoerd sp_readrequest om berichten uit de wachtrij te lezen. Tijdens de uitvoering van sp_readrequestkunt u merken dat de uitzondering optreedt.
De volgende SELECT instructie wordt uitgevoerd sp_readrequest (u moet tracering op instructieniveau verzamelen om deze SELECT instructie te zien):
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.
Wanneer DatabaseMail.exe de uitzondering tegenkomt, wordt een terugdraaiactie geprobeerd maar mislukt. De uitzondering zorgt ervoor dat de transactie buiten het bereik valt. Daarom wordt een transactie die niet langer geldig is, geregistreerd in het database-e-maillogboek.
De hoofdoorzaak van het probleem is echter dat fout 1934 optreedt vanwege een incompatibele SET-optie wanneer de METHODE XML-gegevenstype (MailRequest.Properties.value('(MailItemId)[1]', 'int')) wordt gebruikt in de SELECT instructie.
Het foutbericht controleren
Controleer of het foutbericht in het database-e-maillogboek hetzelfde bericht is (de transactie is niet langer geldig).
Verzamel een profilertracering door gebeurtenissen op instructieniveau, fouten en waarschuwingen en brokergebeurtenissen ingeschakeld te hebben.
Controleer de instelling van het SQL Server-exemplaar voor de standaardverbindingsopties. U doet dit door SQL Server Management Studio te openen, met de rechtermuisknop op Server te klikken en vervolgens Eigenschappenverbindingen>standaardverbindingsopties>>te selecteren, numerieke ronde afgebroken.
Oplossing
Als u dit probleem wilt oplossen, wijzigt u de standaardverbindingsoptie in SET NUMERIC_ROUNDABORT UIT.