Como descartar todas as tabelas de usuário?


Respostas:


294
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                   FROM user_objects
                   WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   LOOP
      BEGIN
         IF cur_rec.object_type = 'TABLE'
         THEN
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '" CASCADE CONSTRAINTS';
         ELSE
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"';
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line ('FAILED: DROP '
                                  || cur_rec.object_type
                                  || ' "'
                                  || cur_rec.object_name
                                  || '"'
                                 );
      END;
   END LOOP;
   FOR cur_rec IN (SELECT * 
                   FROM all_synonyms 
                   WHERE table_owner IN (SELECT USER FROM dual))
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
      END;
   END LOOP;
END;
/

1
depende do que você pretende fazer. você também pode usar a queda do usuário em cascata, mas precisa recriar o usuário.
— Henry Gao

1
Isso funcionou muito bem e não exige que eu tenha autoridade no servidor Oracle para excluir e adicionar novamente meu usuário. Bravo. Ótima resposta.
— djangofan

Recebo java.lang.IllegalArgumentException: nenhum SQL selecionado para execução. Minha ideia é que cur_rec não seja declarado. Como declará-lo, já que isso é composto por bject_name, object_type?
— Lijep barragem

3
Eu acho que o roteiro pode ser perigoso. Se você estiver conectado como SYSDBA, ele excluirá TODAS as tabelas de TODOS os usuários e também TODAS as tabelas do sistema. Na prática, você exclui o banco de dados inteiro. Seja cuidadoso!
— Zardo

Isso é útil para os usuários terem permissão para um determinado esquema, mas não a permissão dba no ambiente de desenvolvimento.
— Henry Gao

201

Se você quer apenas uma maneira realmente simples de fazer isso ... Heres um script que eu usei no passado

select 'drop table '||table_name||' cascade constraints;' from user_tables;

Isso imprimirá uma série de comandos de descarte para todas as tabelas no esquema. Coloque o resultado desta consulta em spool e execute-o.

Fonte: https://forums.oracle.com/forums/thread.jspa?threadID=614090

Da mesma forma, se você quiser limpar mais do que tabelas, poderá editar o seguinte para atender às suas necessidades

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

46

Outra resposta que funcionou para mim é (crédito para http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/ )

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

Observe que isso funciona imediatamente após a execução. Ele não produzir um script que você precisa para colar em algum lugar (como outras respostas aqui). É executado diretamente no banco de dados.


1
Isso funciona para mim, mas eu tive que citar o nome da tabela escrevendo 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Isso é necessário se os nomes das tabelas estiverem em minúsculas.
— ceving 12/03/12

@ ceving bom saber disso! Eu só uso tabelas em maiúsculas, por isso nunca encontrei isso.
— 21412 kazanaki

+1 @ceving também é necessário caso o nome da sua tabela seja uma palavra reservada. Além disso, acrescentaria PURGEno final da DROPdeclaração.
— 10101

Corrigidas as cotações como sugerido no final.
— kazanaki

ORA-24005: utilitários inadequadas usado para executar DDL na mesa AQ
— Skylar Saveland

21
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

12

A maneira mais simples é descartar o usuário que possui os objetos com o comando cascade.

DROP USER username CASCADE

5
Este não é o método certo. Este é um método para excluir um usuário quando o usuário cria objetos, o que requer o uso do CASCADE para excluir as tabelas do usuário antes de o usuário ser excluído. Excluir o usuário não é a pergunta que ele fez.
— djangofan

3
Realiza o objetivo com muita eficácia, principalmente se o esquema for grande. Parece que, no seu caso, evitar qualquer comunicação com o seu DBA é uma alta prioridade. Prefiro soluções que promovam um relacionamento com seu DBA - especialmente se você não tiver privilégios de DBA.
— Brian

2
@ Brian você assume errado. Às vezes, não há um DBA, ou ele está em outra empresa. Ou o caso mais comum - ele não lhe dará acesso para fazer o que você precisa.
— 21412 kazanaki

Sendo novo no Oracle e estou mais familiarizado com o MySQL; redefinir um banco de dados parece difícil. No MySQL a USERé separado para a DATABASE. DROP USER username CASCADEtrabalhou para mim. Mas no MySQL tudo o que eu teria que fazer é DROP DATABASEcriar um novo
— gawpertron 17/08/2012

1
Isso é eficaz para eliminar todo o banco de dados, incluindo as tabelas, se você tiver 1) um script 'CREATE USER' útil com todas as permissões exatas para recriar o banco de dados; e 2) permissão para executar esse script. Se tudo o que você precisa fazer é eliminar tabelas, outras abordagens mencionadas (@kazanaki) são mais apropriadas.
— Rana Ian

7

A maneira mais fácil seria descartar o espaço de tabela e criar o backup do espaço de tabela. Mas prefiro não ter que fazer isso. Isso é semelhante ao de Henry, exceto que eu apenas copio / colo no conjunto de resultados no meu GUI.

SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')

6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables é uma tabela do sistema que contém todas as tabelas do usuário, a cláusula SELECT gerará uma instrução DROP para cada tabela que você pode executar o script


não se esqueça das aspas, caso contrário, você pode tabelas não apagar com letras minúsculas
— masterxilo

2

Para remover todos os objetos no oracle:

1) Dinâmico

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) Estático

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');

1

Por favor, siga os passos abaixo.

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables) 
  loop
     execute immediate i.tb;
  end loop;
  commit;
end;
purge RECYCLEBIN;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.