quarta-feira, 14 de março de 2018

Como apagar todos os objetos de um esquema utilizando o Comandos SQL

Olá pessoal,

este post é para apresentar um script muito interessante que apaga todos os objetos de um esquema, ou seja, deixa o esquema do seu espaço de trabalho vazio.

Lembro que ele não apaga as aplicações, mas apaga todos os objetos e dados do banco.

Passo 1: Logue no espaço de trabalho, entre no "SQL Workshop" > "Comandos SQL"


Passo 2: Copie o comando abaixo e cole na área de texto do Comandos SQL

------INÍCIO SCRIPT-----
--MUITO CUIDADO--
--Este script DROPA todos os objetos do banco de dados

DECLARE 
v_comando VARCHAR2(200);

BEGIN
--Primeiro dropamos as views materializadas, pois internamente o Oracle cria um objeto do tipo TABLE e só permite dropar esse objeto com o comando DROP MATERIALIZED VIEW.
FOR cur IN (SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'MATERIALIZED VIEW') LOOP

     v_comando := 'DROP MATERIALIZED VIEW "'||cur.object_name||'"';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--Depois dropamos as tabelas, pois devemos utilizar o comando cascade constraints para excluir em cascata as constraints da tabela
FOR cur IN (SELECT * FROM USER_TABLES) LOOP

     v_comando := 'DROP TABLE "'||cur.table_name||'" cascade constraints';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--A seguir dropamos os outros objetos (lembrando que package body e jobs são dropados de outra maneira)
FOR cur IN (SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE NOT IN ('PACKAGE BODY', 'JOB', 'LOB')  ) LOOP

     v_comando := 'DROP ' || cur.object_type  || ' "'||cur.object_name||'"';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--Comando para dropar as jobs (scheduler jobs)
FOR cur IN (SELECT * FROM USER_scheduler_jobs ) LOOP

     v_comando := 'DBMS_SCHEDULER.drop_job(job_name =>''' ||cur.job_name||''')';
     htp.p(v_comando);
     DBMS_SCHEDULER.drop_job(job_name => cur.job_name);

END LOOP;

--Observação: Caso tenha jobs do tipo JOBS que estão deprecated, consulte a documentação de como dropá-las.

END;

------FIM  SCRIPT-----

Observação: Caso esteja utilizando colunas em tabela do tipo LOB, os objetos do tipo LOB continuarão ocupando espaço em disco. Caso queira liberar o espaço, a tabela que contém o objeto do tipo LOB deve ser "purgada" da lixeira (RECYCLE BIN) com o comando:

PURGE TABLE <<nome tabela>>

Passo 3) Clique no botão "Executar"

Passo 4) Confira o resultado da execução no painel de Resultados localizado na parte inferior. Caso tenha ocorrido algum problema, tente identificar o motivo.


Observação: Normalmente o feedback final do Apex é de "Tabela eliminada.". Esse feedback é incorreto, pois o Comandos SQL do Apex informa apenas o resultado do primeiro comando executado.

Espero que tenha gostado!
Qualquer dúvida ou, sugestão, deixe no comentário!

Até a próxima!

Como gerar o DDL dos objetos de banco e importar em outro ambiente

Olá pessoal,

seguindo a série de posts "Como colocar uma aplicação Apex em operação utilizando o App Builder e o SQL Workshop", vamos hoje falar sobre a geração do DDL (Data Definition Language) dos objetos de banco e a importação desses objetos em outro ambiente.

Antes de entrarmos propriamente no objetivo do post, gostaria de esclarecer uma dúvida comum de desenvolvedores iniciantes sobre a separação no Apex entre a aplicação e os objetos de banco (tabelas, views, functions, procedures etc).

A aplicação é manipulada no "App Builder", enquanto os objetos de banco e os dados são manipulados pelo desenvolvedor no "SQL Workshop". Apesar do nome SQL Workshop, nesta área é possível também manipular PL/SQL... :)

Veja a imagem abaixo com a identificação de onde manipulamos aplicações e objetos de banco.


Adivinha onde podemos gerar o DDL dos objetos de banco?

Isso mesmo, no SQL Workshop!

Vamos seguir um passo a passo para fazermos essa migração do DDL de um ambiente para outro.

Passo 1) Logar no ambiente que contém os objetos de banco (provavelmente seu ambiente de desenvolvimento) e acessar o SQL Workshop

Passo 2) Clicar em "Utilities" e em "Generate DDL"



Passo 3) Clique no botão "Create Script>"


Passo 4) Selecione o esquema onde os objetos se encontram e clique "Next >".
  
Passo 5) Selecione o tipo de "Output", sugiro "Save As Script File", pois gerará um arquivo que você poderá importar no outro ambiente. Caso deseje que todos os objetos sejam exportados, clique em "Check all" e no botão "Generate DDL". Caso contrário, selecione individualmente cada tipo de objeto que deseja exportar e clique "Next >" para refinar a seleção dos objetos a serem exportados. 



Passo 6) Digite o nome do Script e uma descrição para o script que será criado no repositório do "SQL Scripts" (componente que fica dentro do "SQL Workshop") e clique "Create Script"


Observação: Ao clicar em "Create Script", a geração do script pode ser uma operação bem lenta. No ambiente do apex.oracle.com é tão lento que as vezes dá timeout!!! Aparentemente a lentidão é maior quanto maior a quantidade de objetos no banco todo.

Passo 7) Ao finalizar a criação do script, clique no lápis logo abaixo da coluna "Edit"


Passo 8)  Clique em Download para baixar o arquivo.


Pronto! Você já gerou o arquivo que será necessário para a criação do DDL no outro ambiente.

Obs: Fique atento que a partir de agora os passos serão executados em outro ambiente Apex (normalmente o de operação)!!!

Passo 9) Agora, faça o login no ambiente Apex onde este arquivo será importado e acesse "SQL Workshop" > "SQL Scripts". 



Passo 10) Em SQL Scripts, clique no botão "Upload >".



Passo 11) Selecione o arquivo gerado no passo 8), digite o nome do script e clique "Upload"


Passo 12) Após o upload, clique no "Run" para executar o script.


Passo 13) Antes de executar, o Apex faz um "parse" do seu script e informa a quantidade de comandos. Confira se está ok, e clique em "Run Now"



Passo 14) Confira os erros e caso necessário, utilize o procedimento do post indicado a seguir para "limpar" todo o esquema.




Observação: Alguns erros acontecem, pois às vezes o script gerado pelo Apex cria o mesmo objeto duas vezes e ocorre o erro de nome já utilizado em outro objeto ("name is already used by an existing object"). Acontece muito com índices de chave primária e índices de LOB.

Pronto! Agora seus objetos estão todos no esquema desejado!

Para conferir os objetos criados, você pode acessar o "SQL Workshop > Browser de objetos".

Lembrando que os dados não foram migrados. Em breve, postaremos como migrar os dados de outro esquema. Não perca!

Espero que tenha gostado.

Deixe seu comentário!