locked
Problema com Transação Distribuida - MSDTC RRS feed

  • Pergunta

  • Boa Tarde!

    Estou com um problema e não sei como resolver. Já olhei vários sites e não consegui achar o erro. Aqui consegui chegar mais proximo de resolver. Pessoal tenho a seguinte situação: Existe um servidor servidor A que vai passar dados para outro sevidor B que não estão na mesma rede. O servidor A tem winXp e o servidor B (que receberá os dados) é win server 2003. Ambos estão com o sql-server 2000 sp4. O servidor A vai realizar os inserts, updates e delete e o mesmo vai ser passado para o servidor B. Para acontecer isso eu criei um linked server no servidor A (com winXp/sqlserver2000). Pelo query analyser eu consigo fazer essas operações normalmente. Só que quando faço isso através de trigger me dá o erro abaixo:

    Server: Msg 7391, Level 16, State 1, Procedure trg_ai_Operadores, Line 10
    The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.
    [OLE/DB provider returned message: A nova transação não pode ser inscrita no coordenador de transação especificado. ]
    OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].

    Já olhei vários tópicos para configurar o MSDTC e ativa-lo nos 2 nós. Segue 2 tópicos que verifiquei:

    http://support.microsoft.com/kb/817064/pt-br
    http://support.microsoft.com/kb/839279

    Verifiquei também o firewall dos 2 nós. Estão desabilitados e depois habilitei-os e fiz os procedimentos conforme link acima e mesmo assim não consegui.

    Fazendo o seguinte select no query analyser eu consigo trazer os resultados:

    select * from linkedserver.banco.dbo.Tabela



    Se eu realizar o select dessa forma o erro citado acontece:

    begin distributed transaction

    select * from linkedserver.banco.dbo.Tabela

    commit tran


    Segue abaixo o modelo da minha trigger:

    create trigger trg_ai_Operadores
    on TblOperadores
    after insert
    as
      if exists(select * from inserted)
      begin
        set xact_abort on
        begin distributed transaction

        insert into <Campos> select <Campos> from inserted

        commit tran
        set xact_abort off
      end




    Alguém poderia me ajudar a resolver o erro ou enxergar uma melhor forma para atualizar os dados no servidor B?

    Grato

    Renato
    terça-feira, 3 de março de 2009 18:36

Todas as Respostas

  • Renato, boa noite.

    Desculpe-me pela demora, mas esta semana estou a um pouco complicado.

    Em relação a sua dúvida você esta tentando fazer acesso a dados que estão em outro servidor SQL Server, através de um linked server.

    Gostaria de saber o porque você esta utilizando o Begin Distributed Transaction no comando select?

    Não é necessário utilizar o Begin Distributed Transaction quando se trabalha com o comando Select!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 7 de março de 2009 22:08
    Moderador
  • Com relação ao Begin Distributed Transaction no comando select não estou utilizando ele pra realizar o select. É que no site da microsoft onde eu achei uma explicação sobre o erro, o mesmo pede para fazer algumas configurações no servidor e realizar um select, como teste, usando o Begin Distributed Transaction. Se retornasse o resultado estaria correta a configuração senão ainda tinha problema. Eu só uso o Begin Distributed Transaction na trigger, quando vou faze o insert no outro servidor SQL-Server.

    Eu estou tentando fazer acesso aos dados em outro servidor SQL-Server, inclusive estão em redes diferentes com outra faixa de IP. Pelo Query Analyzer eu consigo fazer qualquer tipo de operação, select, update, delete, sem o uso do Begin Distributed Transaction.

    Pelo sistema que não estou conseguindo pois existe uma trigger, na tabela, que dispara um insert em outro servidor (citado acima). Segue o Modelo da minha trigger usada:

    create trigger trg_ai_Operadores
    on TblOperadores
    after insert
    as
      if exists(select * from inserted)
      begin
        set xact_abort on
        begin distributed transaction

        insert into <Campos> select <Campos> from inserted

        commit tran
        set xact_abort off
      end


    Até agora não consegui resolver o problema.
    segunda-feira, 9 de março de 2009 15:02