2009-11-06 17 views
126

Come posso eliminare tutte le tabelle utente in oracle?Come eliminare tutte le tabelle utente?

Ho problemi con i vincoli. Quando disabilito tutto non è ancora possibile.

+0

Che ne dite di far cadere i vincoli invece di disattivazione? –

risposta

237
BEGIN 
    FOR cur_rec IN (SELECT object_name, object_type 
        FROM user_objects 
        WHERE object_type IN 
          ('TABLE', 
           '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; 
END; 
/
+1

dipende da cosa hai intenzione di fare. puoi anche utilizzare drop user cascade ma devi ricreare l'utente. –

+1

Questo ha funzionato molto bene e non richiede che io abbia l'autorizzazione sul server Oracle per eliminare e riaggiungere il mio utente. Bravo. Bella risposta. – djangofan

+0

ha funzionato immediatamente fuori dagli schemi! Grazie –

10

Il modo più semplice è far cadere l'utente che possiede gli oggetti con il comando cascade.

DROP USER username CASCADE 
+4

Questo non è il metodo giusto. Questo è un metodo per eliminare un utente quando l'utente ha creato oggetti, che richiede l'uso di CASCADE per eliminare le tabelle degli utenti prima che l'utente venga eliminato. Cancellare l'utente non è la domanda che ha chiesto. – djangofan

+3

Raggiunge in modo molto efficace l'obiettivo, in particolare se lo schema è di grandi dimensioni. Sembra che nel tuo caso evitare qualsiasi comunicazione con il tuo DBA sia una priorità assoluta. Preferisco le soluzioni che favoriscono una relazione con il tuo DBA, in particolare se non hai i privilegi DBA. –

+2

@Brian si presume sbagliato.A volte non esiste un DBA o è in un'altra compagnia. O il caso più comune - non ti darà l'accesso per fare ciò che ti serve. – kazanaki

4

Il modo più semplice sarebbe quello di eliminare lo spazio tabella e quindi ripristinare lo spazio tabella. Ma preferirei non doverlo fare. Questo è simile a quello di Henry, tranne che faccio solo una copia/incolla sul set di risultati nella mia 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') 
37

Un'altra risposta che ha funzionato per me è (credito per 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; 

Nota che questo funziona subito dopo lo si esegue. Lo standard NON produce uno script che è necessario incollare da qualche parte (come altre risposte qui). Funziona direttamente sul DB.

+1

Questo funziona per me, ma ho dovuto citare il nome della tabella scrivendo ''DROP TABLE' '|| c.table_name ||'" CASCADE CONSTRAINTS''. Questo è necessario, se i nomi delle tabelle sono in minuscolo. – ceving

+0

@ bello bello sapere questo! Uso solo le tabelle maiuscole, quindi non l'ho mai incontrato. – kazanaki

+0

+1 @ceving anche nel caso in cui il nome della tabella sia una parola riservata. Inoltre, aggiungo 'PURGE' alla fine dell'istruzione' DROP'. – Tsar

164

Se si desidera solo un modo davvero semplice per fare questo .. Heres uno script che ho usato in passato

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

questo stampa una serie di comandi calo per tutte le tabelle nello schema. Spool il risultato di questa query ed eseguirlo.

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

Allo stesso modo se si desidera cancellare più di tabelle è possibile modificare le seguenti in base alle proprie esigenze

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

Ahh! La top ten delle cose più utili che ho trovato su StackOverflow. grazie :) – phareim

+0

funziona come un incantesimo! – SimpleGuy

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

Il modo più semplice per eliminare tutta la tabella in uno schema ..... –

+0

Questa è la risposta eccellente. Grazie @ Stéphane Bruckert –

Problemi correlati