Condividi tramite


MSSQLSERVER_7391

Si applica a: SQL Server

Attributo Valore
Prodotto SQL Server
ID evento 7391
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico RMT_TRANS_JOIN_FAIL
Testo del messaggio Impossibile eseguire l'operazione. Il provider OLE DB "%ls" per il server collegato "%ls" non è riuscito ad avviare una transazione distribuita.

Spiegazione

Questo errore si verifica perché il servizio Microsoft Distributed Transaction Coordinator (MSDTC) non è in esecuzione o ha disabilitato l'accesso alla rete.

In alcuni casi, è anche possibile che venga visualizzato l'errore 8522:

Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.

I numeri di errore compresi nell'intervallo compreso tra 7300 e 7399 indicano un problema che interessa il provider. Poiché ogni provider potrebbe avere funzionalità diverse e visualizzare dettagli diversi, potrebbe non essere visualizzato un messaggio di errore completo. Per recuperare il messaggio di errore completo dai provider, eseguire il comando seguente prima di eseguire la query che genera l'errore:

DBCC TRACEON (3604, 7300)

Se si riceve l'errore 7391 da un processo, ad esempio la replica di SQL Server o SQL Server Integration Services (SSIS), è anche possibile che venga visualizzato il messaggio di errore se il codice contiene un'istruzione BEGIN DISTRIBUTED TRAN .

Azione utente

Nota

È consigliabile limitare il codice in una transazione che implica una query distribuita eseguita solo al server remoto.

Supporto

  • Per verificare se il driver supporta le transazioni distribuite, contattare il fornitore del driver usato nella query del server collegato.

  • Controllare se l'oggetto nel server di destinazione punta al primo server. Questa situazione è nota come situazione di loopback. I server collegati loopback sono destinati ai test e non sono supportati per molte operazioni, ad esempio le transazioni distribuite.

Comunicazione server

Per assicurarsi che la comunicazione tra server abbia esito positivo, seguire questa procedura:

  1. Controllare se la risoluzione dei nomi di rete funziona. Assicurarsi che i server possano comunicare tra loro per nome e non solo per indirizzo IP. Archiviare entrambe le direzioni, ad esempio dal server A al server B e dal server B al server A. Risolvere tutti i problemi di risoluzione dei nomi nella rete prima di eseguire la query distribuita. Ciò potrebbe comportare l'aggiornamento dei file WINS, DNS o LMHost.

  2. Se si dispone di un firewall, assicurarsi che le porte RPC (Remote Procedure Call) siano aperte correttamente. Per altre informazioni, vedere gli articoli seguenti:

  3. Controllare l'oggetto a cui si punta nel server di destinazione. Se l'oggetto è una visualizzazione o una stored procedure o se fa sì che un trigger venga eseguito, verificare se punta in modo implicito a un altro server. In tal caso, il terzo server è l'origine del problema. Eseguire la query direttamente nel terzo server. Se non è possibile eseguire questa operazione, la query del server collegato non è il problema. Risolvere prima il problema sottostante.

  4. Controllare se si usa il server di accesso remoto (RAS) per accedere ai server remoti. In tal caso, assicurarsi di aver implementato Routing RAS (RRAS). I server collegati non funzionano in RAS perché RAS consente solo la comunicazione unidirezionale.

Configurazione del server

Per configurare i server, seguire questa procedura:

  1. Avviare Distributed Transaction Coordinator (DTC o MS DTC) in tutti i server coinvolti nella transazione distribuita. Per informazioni sull'abilitazione dell'accesso DTC di rete, vedere Messaggio di errore del provider OLE DB - SQL Server.

  2. Impostare l'opzione XACT_ABORT su ON per le istruzioni di modifica dei dati in una transazione implicita o esplicita rispetto alla maggior parte dei provider OLE DB, incluso SQL Server. A tale scopo, eseguire il comando seguente prima di eseguire la query.

    SET XACT_ABORT ON
    

    Nota

    Questa opzione non è necessaria se il provider supporta transazioni nidificate.

  3. Controllare se uno dei server si trovano in un cluster di failover di Windows Server. Il servizio MSDTC nel cluster deve avere un proprio indirizzo IP. Assicurarsi che la risoluzione corretta dei nomi del servizio DTC venga eseguita in ogni server. L'indirizzo IP del DTC deve essere definito nel sistema di risoluzione dei nomi, ad esempio WINS, DNS o LMHosts. Verificare che ogni server possa comunicare con MSDTC negli altri server in base al nome e non solo all'indirizzo IP. Controllare entrambe le direzioni. Ad esempio, controllare dal server A al servizio MSDTC del server B e quindi controllare dal server B al server A MSDTC. È necessario risolvere tutti i problemi di risoluzione dei nomi nella rete prima di eseguire la query distribuita. Per configurare MSDTC in un cluster, vedere Raccomandazioni MSDTC nel cluster di failover SQL - Hub della community Microsoft.

  4. Se si usa la tecnologia dei server remoti meno recenti anziché i server collegati consigliati, impostare l'opzione di configurazione remote proc trans su OFF per il server o eseguire un'istruzione prima di eseguire qualsiasi SET REMOTE_PROC_TRANSACTIONS OFF query distribuita. Se questa impostazione è impostata su ON, le chiamate di routine remota vengono effettuate in una transazione locale. Per altre informazioni, vedere Configurare l'opzione remote proc trans (opzione di configurazione del server) - SQL Server.

  5. Controllare il valore restituito della funzione @@SERVERNAME di sistema in entrambi i server. Verificare se il valore restituito corrisponde al nome computer di ogni server. Se non corrisponde, rinominare il server.

  6. Verificare che l'account di avvio di SQL Server disponga delle autorizzazioni di controllo completo per la chiave del Registro di sistema seguente:

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

Passaggi successivi