Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
| Attribute | Value |
|---|---|
| Produto | SQL Server |
| ID do Evento | 7391 |
| Origem do evento | MSSQLSERVER |
| Componente | SQLEngine |
| Nome simbólico | RMT_TRANS_JOIN_FAIL |
| Texto da mensagem | A operação não pôde ser executada porque o provedor OLE DB "%ls" para servidor vinculado "%ls" não pôde iniciar uma transação distribuída. |
Explanation
Este erro ocorre porque o serviço Coordenador de Transações Distribuídas da Microsoft (MSDTC) não está a funcionar ou desativou o acesso à rede.
Em alguns casos, pode também receber o erro 8522:
Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.
Números de erro que se situam entre 7300 e 7399 indicam um problema que afeta o fornecedor. Como cada fornecedor pode ter capacidades diferentes e mostrar detalhes distintos, pode não receber uma mensagem de erro completa. Para recuperar a mensagem de erro completa dos fornecedores, execute o seguinte comando antes de executar a consulta que gera o erro:
DBCC TRACEON (3604, 7300)
Se receber o erro 7391 de um processo como replicação do SQL Server ou SQL Server Integration Services (SSIS), também pode receber a mensagem de erro se o código contiver uma BEGIN DISTRIBUTED TRAN instrução.
Ação do usuário
Note
É uma boa prática limitar o seu código numa transação que envolva uma consulta distribuída feita apenas ao servidor remoto.
Capacidade de suporte
Para verificar se o driver suporta transações distribuídas, contacte o fornecedor do driver que utiliza na consulta do seu servidor ligado.
Verifique se o objeto no servidor de destino aponta de volta para o primeiro servidor. Isto é conhecido como uma situação de loopback. Os servidores ligados de loopback destinam-se a testes e não são suportados para muitas operações, como transações distribuídas.
Comunicação com servidores
Para garantir que a comunicação entre servidores é bem-sucedida, siga estes passos:
Verifique se a resolução dos nomes da sua rede funciona. Certifique-se de que os servidores podem comunicar entre si pelo nome e não apenas pelo endereço IP. Verifique em ambas as direções (por exemplo, do servidor A para o servidor B e do servidor B para o servidor A). Resolve todos os problemas de resolução de nomes na rede antes de executares a tua consulta distribuída. Isto pode envolver a atualização dos ficheiros WINS, DNS ou LMHost.
Se tiver um firewall, certifique-se de que as portas de Chamada de Procedimento Remoto (RPC) estão abertas corretamente. Para mais informações, consulte os seguintes artigos:
Verifica o objeto para o qual apontas no servidor de destino. Se o objeto for uma vista ou um procedimento armazenado, ou se causar a execução de um gatilho, verifique se aponta implicitamente para outro servidor. Se assim for, o terceiro servidor é a origem do problema. Executa a consulta diretamente no terceiro servidor. Se não conseguires fazer isto, a consulta do servidor ligado não é o problema. Resolve primeiro o problema subjacente.
Verifique se está a usar o Remote Access Server (RAS) para aceder a servidores remotos. Se sim, certifique-se de que implementou o Routing RAS (RRAS). Servidores ligados não funcionam no RAS porque o RAS permite apenas comunicação unidirecional.
Configuração do servidor
Siga estes passos para configurar os servidores:
Inicie o Coordenador de Transações Distribuídas (DTC ou MS DTC) em todos os servidores envolvidos na transação distribuída. Para informações sobre como ativar o acesso DTC em rede, veja Mensagem de erro do fornecedor OLE DB - SQL Server.
Defina a XACT_ABORT opção ON para instruções de modificação de dados numa transação implícita ou explícita contra a maioria dos fornecedores OLE DB, incluindo o SQL Server. Pode fazer isto executando o comando seguinte antes de executar a sua consulta.
SET XACT_ABORT ONNote
Esta opção não é obrigatória se o fornecedor suportar transações aninhadas.
Verifique se algum dos servidores está num Cluster de Failover do Windows Server. O serviço MSDTC no cluster deve ter o seu próprio endereço IP. Certifique-se de que a resolução correta dos nomes do serviço DTC ocorre em cada servidor. O endereço IP do DTC deve ser definido no seu sistema de resolução de nomes (como WINS, DNS ou LMHosts). Verifique se cada servidor pode comunicar com o MSDTC nos outros servidores pelo nome e não apenas pelo endereço IP. Verifica em ambas as direções. Por exemplo, verifique do servidor A para o serviço MSDTC do servidor B, e depois verifique do servidor B para o MSDTC do servidor A. Deve resolver todos os problemas de resolução de nomes na rede antes de executar a sua consulta distribuída. Para configurar o MSDTC num cluster, consulte Recomendações MSDTC sobre o SQL Failover Cluster - Microsoft Community Hub.
Se estiveres a usar a tecnologia de servidores remotos mais antigos em vez dos recomendados servidores ligados, define a opção de configuração de proc trans remota para
OFFo servidor, ou executa umaSET REMOTE_PROC_TRANSACTIONS OFFinstrução antes de executares qualquer consulta distribuída. Se esta definição for definida paraON, as chamadas de procedimento remoto são feitas numa transação local. Para mais informações, veja Configurar a transferência remota de proc (opção de configuração do servidor) - SQL Server.Verifique o valor de retorno da função
@@SERVERNAMEdo sistema em ambos os servidores. Verifique se o valor de retorno corresponde ao nome do computador de cada servidor. Se não corresponder, muda o nome do servidor.Verifique se a conta de arranque do SQL Server tem permissões de controlo total sobre a seguinte chave de registo:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer