Como descartar todas as tabelas de usuário?

160

Como posso eliminar todas as tabelas de usuários no oracle?

Eu tenho problemas com restrições. Quando desativo tudo, ainda não é possível.

szaman
fonte
Que tal eliminar as restrições em vez de desativá-las?
David Aldridge

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;
/
Henry Gao
fonte
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')
quilo
fonte
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.

kazanaki
fonte
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;
Md. Maksud Alam
fonte
12

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

DROP USER username CASCADE
Brian
fonte
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')
TJR
fonte
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

ANiket Chavan
fonte
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');
Goyal Vicky
fonte
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;
Lova Chittumuri
fonte