quarta-feira, 9 de maio de 2018

Migrando os dados utilizando o Comandos SQL

Olá pessoal,

vamos para nossa última postagem da "trilogia" de posts sobre colocar uma aplicação Apex em operação.

O post de hoje é sobre a migração dos dados de um ambiente para outro.

Normalmente quando estamos colocando uma aplicação em operação, queremos migrar alguns dados. Os principais dados que normalmente tem que ser migrados são os de tipo, por exemplo: TIPO_ALUNO, TIPO_PROCESSO, etc.

Entretanto, em ambientes onde o desenvolvedor consegue fazer alterações diretamente na operação (produção), é comum que ele comece a fazer as alterações diretamente na operação e abandone o ambiente de desenvolvimento. Cuidado com essa má prática!

Vamos abordar duas situações para essa migração de dados:
1) Ambiente de origem e destino no mesmo banco
2) Ambiente de origem e destino em bancos diferentes

MIGRAÇÃO DE DADOS COM AMBIENTES NO MESMO BANCO

Segue um passo a passo para a migração.

Passo 1) Entrar no Comandos SQL do ambiente que contém os dados. (Tenha atenção neste passo, para não errar o ambiente). "SQL Workshop" > "Comandos SQL"




Passo 2)  Copie e cole o script abaixo no Comandos SQL para fornecer os grants de SELECT para seu ambiente de destino. Não esqueça de trocar a variável "v_ambiente_destino" para o nome do seu ambiente de destino!

-----INICIO SCRIPT-----
DECLARE
v_comando VARCHAR2(200);
v_ambiente_destino VARCHAR2(30) := 'APEX_ANDERSON'; --INSIRA SEU AMBIENTE DE DESTINO
BEGIN
--Fornece permissão de leitura em todas as tabelas deste owner
FOR cur IN (SELECT * FROM USER_TABLES) LOOP
     v_comando := 'GRANT SELECT ON "'||cur.table_name||'" TO '||v_ambiente_destino;
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;
END LOOP;
END;
-----TERMINO SCRIPT-----

Passo 3) Clique em "Executar" ("Run" para versão em inglês) (1) e confirme que tudo ocorreu bem no painel inferior (2).



Passo 4) Entre no Comandos SQL do ambiente de destino onde os dados serão carregados. (ATENÇÃO para entrar no ambiente correto!)

Passo 5) Copie e cole o script abaixo no Comandos SQL e clique em "Executar" (ou "Run") para carregar os dados que se encontram no seu ambiente de origem. Não esqueça de trocar a variável "v_ambiente_origem" para o nome do seu ambiente de origem!

-----INICIO SCRIPT-----
DECLARE

v_comando VARCHAR2(200);

v_ambiente_origem VARCHAR2(30) := 'APEX_ANDERSON_DEV';--INSIRA SEU AMBIENTE DE ORIGEM DOS DADOS

BEGIN


--Primeiro desabilite todas as constraints 

FOR i IN (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'R') LOOP

v_comando := 'alter table "'||i.table_name||'" disable constraint "'||i.constraint_name||'"';

htp.p(v_comando);

EXECUTE IMMEDIATE v_comando;


END LOOP;

--Para todas as tabelas do ambiente de origem serão carregadas as informações. Caso não queira que alguma tabela seja carregada, acrescente ao NOT IN

FOR cur IN (SELECT * FROM ALL_TABLES where owner = v_ambiente_origem AND upper(table_name) NOT IN ('HTMLDB_PLAN_TABLE', 'OUTRA_TABELA')) LOOP

     v_comando := 'INSERT INTO "'||cur.table_name||'" SELECT * FROM "'||v_ambiente_origem||'"."'||cur.table_name||'"';

     htp.p(v_comando);

     EXECUTE IMMEDIATE v_comando;

END LOOP;



--Ao final habilite novamente todas as constraints 


FOR i IN (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'R') LOOP

v_comando := 'alter table "'||i.table_name||'" enable constraint '||i.constraint_name||'';

htp.p(v_comando);

EXECUTE IMMEDIATE v_comando;


END LOOP;

END;
-----TERMINO SCRIPT-----



Pronto! Seu novo ambiente está com os dados desejados.


Caso seu banco de origem e destino dos dados sejam diferentes, segue outro passo a passo.


MIGRAÇÃO DE DADOS COM AMBIENTES EM BANCOS DIFERENTES


Este procedimento apenas no Apex (sem utilizar ferramenta) com bancos diferentes utiliza um processo bem mais manual. Só vale a pena executá-lo caso você queira migrar um número pequeno de tabelas.

Outro detalhe é que caso sua tabela tenha milhões de registros, como a exportação é web, as vezes não funciona bem.

Ressalto que o procedimento é para bancos diferentes. Caso sua aplicação esteja em workspaces e esquemas diferentes, mas está no mesmo banco, o melhor procedimento é o descrito acima.

Passo 1) Logue no ambiente Apex que contém os dados que deseja exportar (ambiente de origem).

Passo 2) Acesse o Data Workshop. "SQL Workshop > Utilities > Data Workshop"

Passo 3) Na seção "Data Unload", você pode escolher entre gerar um arquivo TXT ou XML com os dados de uma tabela. Para este tutorial, vamos selecionar "to XML"
Nota: Este é um dos pontos ruins da descarga de dados, pois você tem que fazer tabela a tabela.



Passo 4) Selecione as informações que devem ser incluídas no arquivo: owner, nome da tabela e as colunas que serão incluídas.
Essa seleção das colunas é um dos pontos de dificuldade dos desenvolvedores. Caso queira selecionar todas as colunas, clique na primeira coluna, mantenha pressionado o "Shift" no teclado e clique na última coluna ou clique em qualquer coluna e pressione "Ctrl"+A. Caso queira colunas específicas, mantenha pressionado "Ctrl" e vá clicando sobre as colunas desejadas.
Ao final, caso queira que os dados sejam gerados de maneira condicional, adicione algum comando no campo "Where Clause". Por exemplo, podemos descarregar somente os dados que foram criados pelo login "ANDERSONRF" com o comando CREATED_BY = 'ANDERSONRF' conforme mostra a figura abaixo.




Passo 5) Pressione "Unload Data" e o arquivo (XML ou TXT) será gerado.
Nota: Essa ação pode demorar um pouco dependendo da quantidade de dados.


Passo 6) Logue no ambiente de destino dos dados. Fique atento para não errar o ambiente!


Passo 7) Acesse "SQL Scripts" > "Data Workshop"


Passo 8) Na seção "Data Load" escolha o mesmo tipo de arquivo selecionado no Passo 3). (Seguindo nosso tutorial, devemos selecionar "XML Data").


Passo 9) Selecione o esquema, tabela e o arquivo gerado no passo Passo 5) e pressione o botão "Load Data".




Pronto! Agora seus dados foram carregados.


Espero que tenha gostado.

Qualquer problema, poste nos comentários.

Até a próxima!

Nenhum comentário:

Postar um comentário