none
SQL realizando insert dentro do Oracle RRS feed

  • Pergunta

  • Bom dia pessoal, estou com uma dificuldade para realização de insert em um tabela dentro de um banco de dados oracle. Hoje possuo uma server SQL 2008 e um Oracle 10g em maquinas diferentes.

    Criei um linked server do SQL para o oracle e hoje consigo realizar SELECT normalmente em qualquer tabela dentro do Oracle. Ate aqui esta tranquilo. Quando eu realizo um insert simples dentro do Oracle, o mesmo grava a informação e consigo acessa-la, por meio de um JOB eu tambem consigo realizar o mesmo insert. Agora quando eu pego o mesmo insert e coloco no dentro de uma Trigger para que esse insert seja de forma online ou dentro de uma Store Procedure me apresenta o seguinte erro:

    Msg 7391, Level 16, State 2, Procedure TR_COPIA_PROD_SIMA, Line 11

    The operation could not be performed because OLE DB provider "MSDAORA" for linked server "ORACLE" was unable to begin a distributed transaction.

     

    OBS.: Eu ja habilitei o serviço o "Coordinator Transaction" que existe dentro do Windows para realizacao de transacoes distribuidas, dentro da arvore do SQL tambem me mostra o que o servico esta habilitado e funcionando.

    segue o script da minha trigger pois nao sei dizer se esta faltando algo no conteudo da mesma.

    ALTER TRIGGER TR_COPIA_PROD_SIMA ON TPRD
    AFTER INSERT, UPDATE
    AS
    
    SET REMOTE_PROC_TRANSACTIONS OFF
    
    SET XACT_ABORT ON 
    
    BEGIN DISTRIBUTED TRANSACTION
    
    	INSERT INTO ORACLE..SISMA.PS_ITA_ITEM_SISMA ( PROCESS_INSTANCE, SETID, INV_ITEM_ID, DESCR60, START_DT, 
    				DEFINE_STATUS, MFG_ITM_ID, INV_ITEM_GROUP, PROCESS_FLAG, PROGRESS_RECID, UNIT_OF_MEASURE )
    	SELECT 
    		'99996'					as 'PROCESS_INSTANCE', 
    		'GERAL'					as 'SETID', 
    		'A00000009999'			as 'INV_ITEM_ID',
    		'PRODUTO TESTE SIMA'	as 'DESCR60', 
    		'20110609'				as 'START_DT', 
    		'0'						as 'DEFINE_STATUS',
    		'VISA'					as 'MFG_ITM_ID', 
    		'1507'					as 'INV_ITEM_GROUP', 
    		'N'						as 'PROCESS_FLAG', 
    		'35900'					as 'PROGRESS_RECID',
    		'UN'					as 'UNIT_OF_MEASURE'
    COMMIT TRANSACTION
    
    
    
    

    Fico grato pela ajuda.


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    • Movido Gustavo Maia Aguiar sexta-feira, 17 de junho de 2011 14:44 (De:SQL Server - Desenvolvimento Geral)
    sexta-feira, 17 de junho de 2011 13:42

Respostas

Todas as Respostas

  • Bom Dia,

    Não basta que o DTC esteja habilitado, pois, o coordenador de transações distribuídas do ORACLE não é o DTC (é possível que ele nem esteja sobre um Windows). Você deve ter certeza de que o DTC está configurado para trabalhar com transações distribuídas XA (XA não é XACT_ABORT, mas é o nome do coordenador de transações distribuídas do ORACLE). É um flag que você marca nas propriedades do DTC.

    Como uma recomendação de arquitetura eu não colocaria esse INSERT dentro de uma trigger. A indisponibilidade do ORACLE irá impedir que novos registros sejam cadastrados e isso indisponibilizaria o SQL Server. Adicionalmente, se qualquer coisa "demorar" no ORACLE (lock, ausência de índices, etc), o INSERT será retardado podendo provocar bloqueios se envolto em transações.

    Recomendo exportar peridiocamente os registros. Se há necessidade de ser quase online, use a trigger, mande uma mensagem para o Service Broker e coloque-o para gravar no Oracle de forma assíncrona.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 17 de junho de 2011 14:42
  • Ei Gustavo bom dia,

    Voce poderia me ajudar com essa situacao do Service Broker, pois eu nunca utilizei esse servico do SQL, eu realmente preciso que esse processo que estou desenvolvendo seja online, pois um outro aplicativo ira acessar a minha base de dados e realizar alguns inserts e consultas de estoque, com baixa e tudo mais.


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    sexta-feira, 17 de junho de 2011 15:24
  • Olá Maxwell,

    O Broker é um Plus que eu preferia não expor logo de saída. Independente de utilizá-lo ou não, é preciso primeiro fazer o INSERT funcionar em um contexto transacional. Seja via trigger ou via Broker, essa característica será necessária.

    Se começarmos com o Broker sem resolver o DTC, será bem mais complicado de realizar o troubleshoot.

    Você conseguiu ver o negócio do XA ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 17 de junho de 2011 16:25
  • Gustavo...nao possuo muito conhecimento em Oracle...pra falar a verdade e o meu primeiro contato com ele.

    se puder me passar algum scritp para que eu posso verificar eu consigo rodar o mesmo aqui.

     

    Caso possa me ajudar de uma forma mais online, estou online no skype. maxwellchaves e so ADD.


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    sexta-feira, 17 de junho de 2011 16:57
  • Olá Maxwell,

    Na parte do ORACLE estamos empatados, pois, não sei configurar o XA.
    Na parte de MSDTC, faça o seguinte:

    - Siga os passos do KB (http://support.microsoft.com/kb/817064/en-us)
    - Na tela do DTC marque a opção XA transactions

    Senão funcionar então o negócio é mais complicado um pouco.

    Esses passos precisam estar Ok independente do uso ou não do Broker

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Maxwell Chaves segunda-feira, 20 de junho de 2011 18:25
    sexta-feira, 17 de junho de 2011 20:41
  • Gustavo,

     

     

    Muito obrigado pela ajuda, depois que eu realizei aquela configuração em ambos os servidores resolveu parte do problema, tive que realizar uma modificação muito importante tambem cujo estarei citando abaixo.

       http://www.devmedia.com.br/post-10928-Artigo-SQL-Magazine-58-Consultas-e-transacoes-distribuidas-no-SQL-Server-2005.html

    Este link possui uma parte muito importante que se trata de configurações no registro do Windows que o client do oracle instala de forma errada.

     

    Muito obrigado pela ajuda fornecida. Abraços


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br


    segunda-feira, 20 de junho de 2011 18:34