Pular para o conteúdo
  • Este tópico contém 13 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 1 mês atrás por burga.
Visualizando 14 posts - 1 até 14 (de 14 do total)
  • Autor
    Posts
  • #92607
    flavynha
    Participante

      Prezados ,

      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.

      #92608
      diegolenhardt
      Participante

        Dependendo 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.

        #92609
        flavynha
        Participante

          OBS: 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.

          #92613
          Avatar photoRegis Araujo
          Participante

            Flavynha.. 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..!

            #92616
            flavynha
            Participante

              Ei 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,INSMUN

              SELECT *FROM TESTE.E070FIL where codemp=’15’ or codemp…

              Ta dificil….=/…rsrsrs

              #92618
              flavynha
              Participante

                Correção:

                INSERT INTO PRODUCAO.E070FIL (CODEMP, CODFIL,NOMFIL,SIGFIL,INSEST,INSMUN …. (mais de 50 campos )
                SELECT CODFIL,NOMFIL,SIGFIL,INSEST,INSMUN

                FROM TESTE.E070FIL where codemp=’15’ or codemp…

                #92619
                Peterson
                Participante

                  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.

                  #92622
                  flavynha
                  Participante

                    Desculpem….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.

                    #92623
                    Avatar photoRegis Araujo
                    Participante

                      Ola 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..!

                      #92624
                      flavynha
                      Participante

                        Regis,

                        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!

                        #92625
                        Peterson
                        Participante

                          foi mal Thunder_Catz

                          #92626
                          Avatar photoRegis Araujo
                          Participante

                            Oi 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..!!

                            #92630
                            Anô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;

                              #92634
                              burga
                              Participante

                                Oi 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.

                              Visualizando 14 posts - 1 até 14 (de 14 do total)
                              • Você deve fazer login para responder a este tópico.