- Este tópico contém 13 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 1 mês atrás por
burga.
-
AutorPosts
-
11 de fevereiro de 2010 às 7:06 pm #92607
flavynha
ParticipantePrezados ,
Bom dia!
Temos duas bases de um sistema (produção e teste). O de produção sao onde os funcionarios incluem dados e o de teste é para testar erros, atualizaçoes.
Por erro de um funcionario, foi configurado a base teste para algumas pessoas, resultando em dados inseridos no local errado.Sorte que foi uma base recente e e poucos clientes teve inserção de dados.
O sistema nao permite importar ou exportar informações de um unico cliente. Como posso proceder?Inicialmente me sugeriram identificar todas as tabelas que tem o CODEMP da empresa e excluir todas as informações daquela empresa na base de produção e depois usar o inserte para inserir as tabelas daqueles clientes da base teste na de produção.
Foram criadas as tablespace – producao e teste, os usuarios e senhas e cada tablespace com sua respectiva base.
O comando delete executa corretamente ( apos organizar a sequencia de tabelas maes e filhas) porem o inserte apresenta muitos erros.Existe um meio mais simples, para buscar estas informaçoes??
Att.
11 de fevereiro de 2010 às 7:48 pm #92608diegolenhardt
ParticipanteDependendo de quando foi isso, se as informacoes ainda estiverem nos arquivos de redo, voce poderia usar o logminer para reverter, lá voce vai conseguir identificar somente a transação que baguncou os dados.
11 de fevereiro de 2010 às 8:08 pm #92609flavynha
ParticipanteOBS: Sou meio nova no mundo Oracle, me desculpe se nao entendi corretamente.
Já conseguimos identificar o que foi lançado, porem como estas informações estao na base teste nao precisariamos reverter, o problema é lançar estas informações da base teste para a base de producao.
Exemplo : 500 clientes, 80 foram alterados e inclusao de dados corretos.11 de fevereiro de 2010 às 9:18 pm #92613Regis Araujo
ParticipanteFlavynha.. boa tarde..!
Algumas dúvidas.. estas bases possuem as estruturas de tabelas identicas???
Quais os erros que estão aparecendo? A maneira mais simples seria vc criar um DBLINK do server de produção apontando para o server de teste.. e fazer um insert assim..
insert into tabela_a
select * from tabela_a@dblinkteste
where clausula 1
and clausula 2;-- Os updantes para atualizar dados--
Update tabela_b prod
set prod.campo_a = test.campo_a,
prod.campo_b = test.campo_b,
prod.campo_c = test.campo_c,
prod.campo_d = test.campo_d
where prod.idtabela exists in (select teste.idtabela
from tabela_b@dblinkteste test
where prod.idtabela = teste.idtabela)--obs. o update eu fiz sem ver direito se ta certo.. mas a ideia é esta..
Mas isto sempre respeitando a hirarquia das tabelas..!!! Desta meneira não haveria erros..
Da um exemplo de como esta sendo feito o insert/update…
É trabalhoso.. mas precisa ser feito manualmente para garantir a integridade das informações..
Abraços..!
11 de fevereiro de 2010 às 9:42 pm #92616flavynha
ParticipanteEi Regis,
A estrutura é identica não muda nada, somente os dados.
O insert e delete que to fazendo e assim:
delete PRODUCAO.E070FIL where codemp=’15’ or codemp …. (sao 41 empresas)
insert into PRODUCAO.E070FIL select *from TESTE.E070FIL where codem=’15’ or ….
O problema é que sao 958 tabelas….. ta sendo trabalhoso demais….. ate porque no delete segue uma sequencia e no insert se faço ao contrario da erros, de valores e sem registro mae.
Tem algumas tabelas que uso o insert direto sem campos e não apresenta erro , mas outras apresentam e tem que incluir campos:
INSERT INTO PRODUCAO.E070FIL (CODEMP, CODFIL,NOMFIL,SIGFIL,INSEST,INSMUN …. (mais de 50 campos )
SELECT CODFIL,NOMFIL,SIGFIL,INSEST,INSMUNSELECT *FROM TESTE.E070FIL where codemp=’15’ or codemp…
Ta dificil….=/…rsrsrs
11 de fevereiro de 2010 às 9:45 pm #92618flavynha
ParticipanteCorreção:
INSERT INTO PRODUCAO.E070FIL (CODEMP, CODFIL,NOMFIL,SIGFIL,INSEST,INSMUN …. (mais de 50 campos )
SELECT CODFIL,NOMFIL,SIGFIL,INSEST,INSMUNFROM TESTE.E070FIL where codemp=’15’ or codemp…
11 de fevereiro de 2010 às 9:58 pm #92619Peterson
ParticipanteO que ia sugerir é exatamente isso que a Flavynha disse, fazer um dblink entre os 2 bancos e fazer um insert na base de produção usando como fonte o select na base de teste.
11 de fevereiro de 2010 às 11:21 pm #92622flavynha
ParticipanteDesculpem….nao sei criar um DBLINK, vou estudar aqui e ve como que funciona.
Pensei que pelo usuario system /connect: sysdba tinha ermissao de conexao com dois bancos, sem criar nada, poderia copiar de um e inserir na outra apenas com o comandos acima.12 de fevereiro de 2010 às 12:06 am #92623Regis Araujo
ParticipanteOla Flavynha..!!
Para criação de DBLINK vc precisa primeiro adicionar uma entrada no TNSNAMES apontando para o banco de destino…
Ai vc testa a conexão via comando dentro do CMD…
TNSPING
E depois vc roda este script..
CREATE PUBLIC DATABASE LINK LK.NOME_DB_LINK
CONNECT TO IDENTIFIED BY USING ''PS. Ei Peterson.. não me chamo Flavynha não.. ¬¬
O que ia sugerir é exatamente isso que a Flavynha disse, fazer um dblink entre os 2 bancos e fazer um insert na base de produção usando como fonte o select na base de teste.
Bom.. qualquer coisa Flavynha.. pode ir postando aqui..!!
E como eu falei.. infelizmente tem q ser feito a mão.. para que você tenha a garantia da integridade dos dados…
Abraços..!
12 de fevereiro de 2010 às 3:03 pm #92624flavynha
ParticipanteRegis,
Bom dia!
Voce disse que preciso criar uma entrada no TNSNAMES, mas to com uma duvida. Eu fiz o seguinte, dentro do TNSNAMES tem o caminho que direciona para um banco que chamei de ORCL, pois estou em um micro testando apenas, sem ser no de produção.
tnsnames.ora Network Configuration File: C:oracleproduct10.2.0db_1networkadmintnsnames.ora
Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.x.xx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)Dentro do PL/SQL eu criei os usuarios/senhas e as tablespace.
CREATE TABLESPACE “PRODUCAO_DATA”
LOGGING
DATAFILE ‘D:ORADATAORCLPRODUCAO_DATA.ORA’
SIZE 10M REUSE AUTOEXTEND ON NEXT 5M
MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL;CREATE TABLESPACE “PRODUCAO_INDEX”
LOGGING
DATAFILE ‘D:ORADATAORCLPRODUCAO_INDEX.ORA’
SIZE 10M REUSE AUTOEXTEND ON NEXT 5M
MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL;CREATE USER “PRODUCAO”
IDENTIFIED BY “producao”
DEFAULT TABLESPACE “PRODUCAO_DATA”
TEMPORARY TABLESPACE “TEMP”
PROFILE DEFAULT ACCOUNT UNLOCK;
GRANT “CONNECT” TO “PRODUCAO”;
GRANT “DBA” TO “PRODUCAO”;
GRANT UNLIMITED TABLESPACE TO “PRODUCAO”;E o mesmo procedimento , criando para base teste.
Exportei as bases – Producao e Teste – usando o comando – exp producao/producao grants=full file=c:…..dmp
E importei as bases – Producao e Teste – usando o comando – imp producao/producao full=yes file=c:…..dmp
E comecei a executar os comandos, desabilitei as triggers.
Como que faço neste caso?
Obrigada pela ajuda!
12 de fevereiro de 2010 às 3:05 pm #92625Peterson
Participantefoi mal Thunder_Catz
12 de fevereiro de 2010 às 3:45 pm #92626Regis Araujo
ParticipanteOi Flavynha.. bom dia..!
Vc fez a importação dentro do mesmo banco? Se sim, não precisa criar DBLINK, vc vai precisar dar GRANT de select para o usuário PRODUÇÃO para os objetos dentro do usuário TESTE.. ai quando vc for rodar seus selects.. basta colocar o owner na frente..!!
select * from TESTE.TB_DADOS;
Mas como isto que vc fez é teste.. vai ser diferente de quando vc aplicar em produção.. se vc for fazer na produção.. sua entrada do TNSNAMES irá ficar assim para criar um DBLINK.
tnsnames.ora Network Configuration File: C:oracleproduct10.2.0db_1networkadmintnsnames.ora
Generated by Oracle configuration tools.
ENTRADA DO TNSNAMES DO BANCO PRODUÇÃO
PRODUCAO =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 111.111.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PRODUCAO)
)
)ENTRADA DO TNSNAMES DO BANCO TESTE
LK.PRODUCAO.TESTE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 222.222.2.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TESTE)
)
)Ai vc roda aquele script que eu passei antes para criar o DBLINK assim..
CREATE PUBLIC DATABASE LINK LK_PRODUCAO_TESTE
CONNECT TO IDENTIFIED BY USING 'LK.PRODUCAO.TESTE'Uma coisa.. o usuário que vc criar o DBLINK tem q ter privilégios dentro do banco de teste.. mas como vc falou que o banco de teste é de desenvolvimento.. creio que em ambos os bancos exista o mesmo owner.. então basta criar com este owner o DBLINK, caso não, vc precisa criar com o owner SYSTEM.
Qualquer coisa.. vai postando aqui…!!!
PS: Peterson, sussa mano..!!!!
Abraços..!!
12 de fevereiro de 2010 às 10:25 pm #92630Anônimo
Se os bancos forem no mesmo esquema podes fazer o seguinte:
Se precisar exportar dados do mesmo schema,
por exemplo do teste para o producao:
logar como system e depois é só executar um sql tipo este:insert into producao.nometabela (
select * from teste.nometabela)Caso ocorra erro informando que os campos não estão iguais
basta abrir a tabela e localizar a de origem e a de destino e criar os campos que estão faltando.Para fazer uma consulta em qualquer tabela de qualquer dos bancos
select * from teste.nometabela;
select * from producao.nometabela;13 de fevereiro de 2010 às 4:38 pm #92634burga
ParticipanteOi flavynha,
ainda existem tabelas do dicionário de dados que podem te auxiliar a criar automaticamente os scripts de inserts selects sem muito esforço…
Dê uma olhada na tabela DBA_TAB_COLUMNS onde existe COLUMN_NAME = ‘CODEMP’. Assim você não precisará esrever tudo na mão…
Exemplo:
DECLARE
stmt VARCHAR2(4000); -- pra montar o insert
stmt2 VARCHAR2(4000); -- pra montar o select
cont NUMBER(5); -- pra controlar a virgula no SQL
BEGIN
FOR i IN (SELECT TABLE_NAME FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME = 'CODEMP' AND OWNER = 'SEU_ESQUEMA') LOOP
stmt := 'INSERT INTO ' || i.TABLE_NAME || ' (';
stmt2 := ' SELECT ';
cont := 0;
FOR j IN (SELECT COLUMN_NAME FROM DBA_TAB_COLUMNS WHERE TABLE_NAME = i.TABLE_NAME AND OWNER = 'SEU_ESQUEMA') LOOP
IF (cont = 0) THEN
stmt := stmt || j.COLUMN_NAME;
stmt2 := stmt2 || j.COLUMN_NAME;
ELSE
stmt := stmt || ',' || j.COLUMN_NAME;
stmt2 := stmt2 || ',' || j.COLUMN_NAME;
END IF;
cont := cont + 1;
END LOOP;
stmt := stmt || ')';
stmt2 := stmt2 || ' FROM ' || i.TABLE_NAME || ' WHERE CODEMP IN (15,16,17,...);'; -- aqui você define os CODEMP
DBMS_OUTPUT.PUT_LINE(stmt || stmt2); -- imprime o SQL pronto.
END LOOP;
END;
/Se for utilizar DBLINK, lembre de modificar o código pra gerar o insert select com o dblink.
Acabei de escrever esse código aqui pelo fórum mesmo e não testei então provavelmente existem falhas, mas a idéia é essa… Só lembre de modificar os OWNERS nos dois selects dos FOR.
-
AutorPosts
- Você deve fazer login para responder a este tópico.