Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola pessoal boa tarde.
Estou precisando montar a seguinte rotina:
Preciso exportar um banco de dados para ORACLE 11G porem não para por ai a aplicação continuará utilizando o SQLSERVER 2012.
Dessa forma o banco SQLSERVER 2012 continuará a ser alimentado com informação.
Eu não entendo de "Procedures" não sei se seria esse caso vou fazer um DBLINK do SQLSERVER X ORACLE porem não sei como fazer para que por exemplo o banco ORACLE seja atualizado a cada 50 novos registros adicionados on SQLSERVER.
Se alguem tiver alguma ideia por favor me avise.
Att.
Olá Motta obrigado pela ajuda ai vai.
O "dono" da aplicação é o SQLSERVER.
O volume é baixo arrisco dizer que não passa de 20 inserts a cada 40minutos
Em segurança não é um fator preocupante a maioria dos dados se trata de números e cálculos e não é nada "Valioso".
Quanto a linguagem utilizada o sistema que se comunica com o sqlserver é o indusoft web studio, porem o oracle não terá comunicação nenhuma ele apenas vai receber as informações do sqlserver.
O sistema que tem o SQLSERVER2012 instalado e funcionando com a aplicação do indusoft é o windows7 e o servidor que tem o oracle é um linux mais ainda tenho que verificar ao certo qual é a versão.
Voce pode me dar exemplos de programas free que eu poderia utilizar para fazer o que me disse ?
E o mais dificil de tudo algo que seja um pouco simples, eu não estou com muito tempo para fazer isso.
Eu estava imaginando utilizar o pentaho o BI open source, porem ele é um pouco complicado.
fico no aguardo.
Este indusoft web studio acessa Oracle e Sql Server ?
O mais simples pode ser uma aplicação lendo uma base, tratando as diferenças e inserindo na outra.
Este processo seria disparado por um agendador (pode ser o do Windows de um servidor )
Após o fim ele log o processo via email , talvez o email apenas se houver erro.
Ola Motta, não o indusoft acessa apenas o SQLSERVER
Deu um bom trabalho mais eu criei a conexão no sqldeveloper com o sqlserver2012.
Acabei de fazer um teste de migração e agora vou ver como ficou.
Eu não conheço praticamente nada de sqldeveloper.
Não sei se é possivel efetuar esse processo automatico por ele mesmo.
No Oracle use o DBMS_SCHEDULER
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm
Não seria possível eu fazer isso diretamente pelo SQLSERVER 2012 ?
Consegui criar um linkedserver
Então cria o "job" no SqlServer, mas aí não sei como se faz, mas deve ter algo assim.
Eu estou mega ocupado esta semana com algumas migrações e diversos projetos, mas pq nao cria um linked server do SQL para o Oracle??
Nao consegui ler o post todo, mas seria uma ideia.
Então eu ja criei o Linked server. Na verdade nunca utilizei linkedserver.
Agora estou tendo dificuldades para criar a JOB. O SQLSERVER AGENT não inicia.
Eu tento inicia-lo mais ele apresenta problemas e não é iniciado.
Agora descobri o porque não estou conseguindo usar o SQLSERVER AGENT.
A versão do SQLSERVER 2012 é a EXPRESS
Pelo que pesquisei o EXPRESS não suporta o AGENT.
>
Então eu ja criei o Linked server. Na verdade nunca utilizei linkedserver.
Agora estou tendo dificuldades para criar a JOB. O SQLSERVER AGENT não inicia.
Eu tento inicia-lo mais ele apresenta problemas e não é iniciado.
Agora descobri o porque não estou conseguindo usar o SQLSERVER AGENT.
A versão do SQLSERVER 2012 é a EXPRESS
Pelo que pesquisei o EXPRESS não suporta o AGENT.
Exato, mas tem suporte ao linkedserver
LinkedServer eh uma extensao do servidor de destino, no seu caso o Oracle.
Com ele, eh possivel fazer desde select no Oracle pelo SQL ateh mesmo insert.
Qual a versao do Oracle?
[]´s
Mais tem como automatizar o processo ?
O Oracle é o 11g
Falei job mas talvez uma trigger seja viável.
Pessoal não sei se é simples ou é o caso de abrir um outro topico só para isso.
Estou fazendo teste agora em meu computador aqui de casa instalei o sqlserver2012 em uma maquina virtual mais quando vou fazer o linked server com o oracle em provider não está aparecendo o Microsoft OLE DB Provider for Oracle.
Muito estranho.
Amigos ressuscitando o tópico eu ainda não consegui finalizar o problema acima eu acabei nem tentando resolver isso é algo que estava acontecendo em meu computador.
Mais continuando. Eu montei o Linkedserver.
Depois criei uma Trigger insert bem simples apenas no mesmo banco.
A trigger que eu criei foi a seguinte:
/* Cria uma nova trigger responsável por duplicar os dados inseridos na tabela tblAluno
a irem tambem para a tabela CopytblAluno */
CREATE TRIGGER TgrCopyAluno
ON tblAluno
FOR INSERT
AS
BEGIN
DECLARE
@IdAluno int,
@Nome varchar(100),
@DataNascimento datetime;
SELECT
@IdAluno = IdAluno,
@Nome = Nome,
@DataNascimento = DataNascimento
FROM
INSERTED
INSERT INTO CopytblAluno
(
IdAluno,
Nome,
DataNascimento
)
VALUES
(
@IdAluno,
@nome,
@DataNascimento
)
END
Porem ao adicionar isso para o linkedserver estou tendo problemas.
ele apresenta o seguinte erro:
msg 8501
MSDTC on server '<nome do server>' is unavailable.
O linked server esta funcionando corretamente o problema esta sendo somente na trigger mesmo.
Devagar que sao dois erros ai.
O linked server funciona?
Onde ele esta mapeado no trigger? Pois estou vendo somente ele dar um insert na CopytblAluno. Ela esta no Oracle ou no SQL?
Ola A.Jr.
Então o erro que estava apresentando era o 8501 em todos os lugares que eu li (maioria em ingles) falaram que era para ativar o "Distributed Transaction Coordinator" eu ativei e segui todos os passas porem passou a apresentar outro erro 7391 que ainda diz estar relacionado ao serviço porem eu ativei ele, desativei o firewall do windows para testar e nada.
O linked server está funcionando certinho já fiz diversos testes de select e insert. O que não funciona é a trigger.
Agora eu estou sem o exemplo da query que esta apresentando o erro.
Mais é basicamente a mesma query que apresentei acima com a diferença que o.
INSERT INTO CopytblAluno
na realidade é
INSERT INTO linkedserver.banco
o linkedserver esta no SQLSERVER.
Ok.
O DTC esta ativo e se vc fizer um "update na unha" no Oracle pelo SQLServer funciona?
Qual a mensagem de erro completa?!
[]´s
Sim, na verdade seria um "INSERT" o insert na unha está funcionando perfeitamente e eu consigo inserir linhas do SQLSERVER para o ORACLE sem problemas.
O erro está acontecendo apenas com a trigger ativa.
Segue o erro completo:
MSG 8501, Level 16, State 3, Procedure CopyCarga01, Line 15
MSDTC on server 'OR-PC\SQLEXPRESS' is unavaliable.
só para especificar
CopyCarga01 = nome da trigger
Tente isso:
Vá em:
START > SETTINGS > CONTROL PANEL > ADMINISTRATIVE TOOLS > SERVICES
Localize o serviço: "Distributed Transaction Coordinator" e verifique se o usuário que esta ativando este serviço tem acesso ao SQL e ao Oracle. Se estiver como Network Services, mantenha assim.
Na sua trigger, coloque:
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
[SEUS COMANDOS]
COMMIT TRANSACTION
SET XACT_ABORT OFF
Ah!!!
Mais uma coisa que tem que ser observada:
Administrative Tools -> Component Services
Component Services -> Computers
Botao direito -> Properties -> MSDTC
Verifique também o usuario que esta na guia "Security"
[]´S
O "Distributed Transaction Coordinator" eu já havia executado todos os procedimentos.
Fiz conforme voce me falou e entre a trigger adicionei esse comando.
Acabou por apresentar outro erro.
MSG 111, level 15, state 1, line 3
'create trigger' must be the first statement in a query batch
Segue codigo
Acabei de editar:
reparei que estava faltando o GO
BEGIN DISTRIBUTED TRANSACTION
GO
CREATE TRIGGER CopyCarga01
Porem mesmo assim o resultado permanece continua no erro 8501
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
CREATE TRIGGER CopyCarga01
ON [BANCO_CARGA].[dbo].[Carga01]
FOR INSERT
AS
BEGIN
DECLARE
@Time_Stamp datetime,
@Time_Stamp_ms int
SELECT
@Time_Stamp = Time_Stamp,
@Time_Stamp_ms = Time_Stamp_ms
FROM
INSERTED
INSERT INTO [ORACLE11G]..[BANCO_CARGA].[CARGA01]
VALUES
(
@Time_Stamp,
@Time_Stamp_ms,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
)
END
COMMIT TRANSACTION
SET XACT_ABORT OFF
Outro edit:
Novamente cometi um erro.
Eu pensei que o serviço Distributed Transaction Coordinator estava ativo porque eu já havia deixado ele ativo antes. Porem ele estava como inicialização "MANUAL" eu alterei para automatica e iniciei o serviço.
Porem continua não funcionando.
Agora apresentou o seguinte erro:
**Msg 7391, Level 16, State 2, Procedure CopyCarga01, Line 14
The operation could not be performed because OLE DB provider "MSDAORA" for linked server "ORACLE11G"**
o BEGIN era dentro da transacao da trigger, deste modo:
CREATE TRIGGER CopyCarga01
ON [BANCO_CARGA].[dbo].[Carga01]
FOR INSERT
AS
BEGIN
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
DECLARE
@Time_Stamp datetime,
@Time_Stamp_ms int
SELECT
@Time_Stamp = Time_Stamp,
@Time_Stamp_ms = Time_Stamp_ms
FROM
INSERTED
INSERT INTO [ORACLE11G].[BANCO_CARGA].[CARGA01]
VALUES
(
@Time_Stamp,
@Time_Stamp_ms,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
)
COMMIT TRANSACTION
SET XACT_ABORT OFF
END
Este erro que deu agora é usuario sem acesso ao linkedserver e/ou falta de chave/dll:
http://support.microsoft.com/kb/280106
Outra coisa... dentro do linked server nao tem dois pontos!!!!
[ORACLE11G].[bANCO_CARGA].[CARGA01]
eh deste modo!!!
Ola sobre a forma incorreta (os dois pontos) eu também pensei a mesma coisa porem se usar [ORACLE11G].[bANCO_CARGA].[CARGA01] apresenta o seguinte erro.
**Msg 208, Level 16, State 1, Procedure CopyCarga01, Line 16
Invalid object name 'ORACLE11G.BANCO_CARGA.CARGA01'**
Estranhamente a Trigger foi até criada, o erro foi apresentado na hora de executar o INSERT para testar a TRIGGER.
Alterando novamente para:
[ORACLE11G]..[bANCO_CARGA].[CARGA01]
a trigger foi criada porem na hora de executar o update o mesmo erro:
**msg 7391, Level 16, State 2, Procedure CopyCarga01, Line 16
the operation could not be performed because OLE DB provider "MSDAORA" for linked server "ORACLE11G" was unable to begin a distributed transaction**
Eu não conheço muito de ORACLE, será que ainda falta eu criar alguma permissão especial diretamente no ORACLE ?
um select funciona??
select top 10 * from ORACLE11G.BANCO_CARGA.CARGA01Consegui fazer Funcionar.
Depois de pesquisar em diversos sites (todos em Inglês), em muitos deles falava que não era possível usar o Provider "Microsoft OLE DB Provider for Oracle" falava para utilizar o "Oracle Provider for OLE DB"
Apenas criei um novo LINKEDSERVER utilizando esse Provider e funcionou, ainda estou realizando testes mais a principio funcionou.
>
Consegui fazer Funcionar.
Depois de pesquisar em diversos sites (todos em Inglês), em muitos deles falava que não era possível usar o Provider "Microsoft OLE DB Provider for Oracle" falava para utilizar o "Oracle Provider for OLE DB"
Apenas criei um novo LINKEDSERVER utilizando esse Provider e funcionou, ainda estou realizando testes mais a principio funcionou.
Que bom que funcionou!!!
[]´s
Quem é o 'dono' da aplicação , lado Oracle ou SqlServer ?
Qual volume disto ?
Em termos de segurança o quanto é crítico ?
Qual o ambiente em questão ? Que linguagens são usadas ? Que Sistemas Operacionais.
Um solução simples seria um programa disparado de n em n minutos, lendo de um BD fazendo críticas, tratamentos e conversões e atualizando o outro BD.Não abre "brechas" como dblinks é simples mas pode ser meio lento se o volume for grande.