Estou tentando executar o SQL em um servidor vinculado, mas recebo os erros abaixo:
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
Existem dois erros retornados pelo provedor:
Erro # 1:
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile:
HelpContext: $00000000
SQLState: 01000
NativeError: 7412
Erro # 2
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile:
HelpContext: $00000000
SQLState: 42000
NativeError: 7391
Como faço para que a Microsoft dê preferência à funcionalidade em vez da segurança?
Ou, pelo menos, como posso fazer com que dois SQL Severs se comuniquem?
Perguntas relacionadas
- A operação não pôde ser realizada porque o provedor OLE DB “SQLNCLI10” ... (* nome do servidor vinculado é
(null)
) - Erro de transação distribuída? ( usando o provedor Oracle )
- Incapaz de se inscrever em uma transação distribuída com NHibernate ( usando Hibernate )
- Erro ao usar transação distribuída no SQL Server 2008 R2 ( SQL Server 2008 R2, sem resposta )
- Erro de transação distribuída apenas por meio de código ( causado por pool de conexão )
- Erro ao executar o coordenador de transações distribuídas no servidor vinculado ( SQL Server 2008, sem resposta )
- Erro de transação distribuída? ( nenhuma resposta aceita; apenas a resposta não ajuda )
- Como inserir na tabela remota usando servidor vinculado com transação int? ( resposta aceita não resolve )
O que eu tenho feito é irrelevante, mas eu vou postá-lo de qualquer maneira.
Certifique-se de que o
Distributed Transaction Coordinator
serviço está sendo executado em ambas as máquinas:Desative toda a segurança MSDTC em ambas as máquinas:
Ative as opções aleatórias no servidor vinculado:
Amaldiçoado e xingado.
Coisas quebradas.
Foi verificado se um
SELECT
pode usar o servidor vinculado :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
Verificado se o servidor cliente pode
ping
o servidor remoto :C:\Documents and Settings\avatar>ping asicmstest.contoso.com Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data: Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.40: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Verificado se o servidor remoto pode se comunicar de volta, por nome, ao servidor inicial:
C:\Documents and Settings\avatar>ping asitestserver.contoso.com Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data: Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.22: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Verificado que
@@SERVERNAME
corresponde ao nome do servidor em ambos os servidores :SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ------------- ------------- ASITESTSERVER ASITESTSERVER
e
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ---------- ---------- ASIGROBTEST ASIGROBTEST
Gritou
Emitido
SET XACT_ABORT ON
antes de emitir minha consulta :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
Concedido
Everyone
Full Control
a :HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
em ambos os servidores.
Respostas:
Encontrado, o MSDTC no servidor remoto era um clone do servidor local.
No registro de eventos de aplicativos do Windows:
Corrida
e, em seguida, parar e reiniciar o serviço SQL Server corrigiu o problema.
fonte
Consegui resolver esse problema (como outros mencionaram nos comentários) desativando "Ativar promoção de transações distribuídas para RPC" (ou seja, configurando-o para
False
):fonte
OK, então os serviços foram iniciados, há um caminho Ethernet entre eles, a resolução de nomes funciona, os servidores vinculados funcionam e você desabilitou a autenticação de transação.
Meu instinto diz problema de firewall, mas algumas coisas vêm à mente ...
fonte
Se os servidores estiverem em cluster e houver um DTC em cluster, será necessário desabilitar a segurança no DTC em cluster e não no DTC local.
fonte
Se o seu servidor de destino estiver em outra nuvem ou data center, será necessário adicionar a entrada de host do serviço MSDTC (servidor de destino) no servidor de origem.
Tente este se o problema não for resolvido, depois de habilitar as configurações do MSDTC.
fonte
Para mim, está relacionado à configuração do Firewall. Vá para a configuração do seu firewall, permita o serviço DTC e funcionou.
fonte
Minha última aventura com o MSDTC e este erro hoje acabou por ser um problema de DNS. Você está no caminho certo perguntando se as máquinas estão no mesmo domínio, EBarr. A propósito, uma lista excelente para esse problema!
Minha situação: eu precisava de um servidor em um domínio filho para poder executar transações distribuídas em um servidor no domínio pai por meio de um firewall. Eu usei servidores vinculados um pouco ao longo dos anos, então tinha todas as configurações usuais em SQL para um servidor vinculado e no MSDTC que Ian documentou tão bem acima. Eu configurei o MSDTC com um intervalo de portas TCP (5000-5200) para usar em ambos os servidores e organizei um buraco no firewall entre as caixas para as portas 1433 e 5000-5200. Isso deveria ter funcionado. O servidor vinculado testou OK e pude consultar o servidor SQL remoto por meio do servidor vinculado, mas não consegui fazer com que ele permitisse uma transação distribuída. Eu podia até ver uma conexão no servidor de QA do servidor DEV, mas algo não estava voltando.
Eu poderia fazer o PING do servidor DEV do QA usando um FQDN como: PING DEVSQL.dev.domain.com
Não consegui fazer PING no servidor DEV apenas com o nome da máquina: PING DEVSQL
O servidor DEVSQL deveria ser membro de ambos os domínios, mas o nome não estava resolvido no DNS do domínio pai ... algo havia acontecido com a conta da máquina para DEVSQL no domínio pai. Depois que adicionamos DEVSQL ao DNS para o domínio pai e "PING DEVSQL" funcionou no servidor de controle de qualidade remoto, esse problema foi resolvido para nós.
Eu espero que isso ajude!
fonte
Além das configurações de segurança, tive que abrir algumas portas em ambos os servidores para que a transação fosse executada. Tive que abrir a porta 59640, mas de acordo com a seguinte sugestão, a porta 135 deve ser aberta. http://support.microsoft.com/kb/839279
fonte
Eu estava recebendo o mesmo erro e consegui resolvê-lo configurando o MSDTC corretamente no servidor de origem para permitir a saída e permitir o DTC através do firewall do Windows.
Permitir que o coordenador de transações distribuídas, marque domínio, opções privadas e públicas
fonte