Come eliminare tutte le tabelle utente?


Risposte:


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
dipende da cosa hai intenzione di fare. puoi anche usare drop user cascade ma devi ricreare l'utente.
Henry Gao,

1
Questo ha funzionato molto bene e non richiede l'autorizzazione sul server Oracle per eliminare e aggiungere nuovamente il mio utente. Bravo. Bella risposta.
Djangofan,

Ottengo java.lang.IllegalArgumentException: nessun SQL selezionato per l'esecuzione .. La mia idea è che cur_rec non sia dichiarato. Come dichiararlo poiché questo è composto da bject_name, object_type?
Lijep Dam,

3
Penso che la sceneggiatura possa essere pericolosa. Se sei connesso come SYSDBA, elimina TUTTE le tabelle di TUTTI gli utenti e TUTTE le tabelle di sistema. In pratica si cancella l'intero DB. Stai attento!
Zardo,

Ciò è utile per gli utenti che dispongono di un'autorizzazione per un determinato schema ma non per l'autorizzazione dba nell'ambiente di sviluppo.
Henry Gao,

201

Se vuoi solo un modo davvero semplice per farlo ... Ecco uno script che ho usato in passato

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

Ciò stamperà una serie di comandi di rilascio 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ù delle tabelle, è possibile modificare quanto segue in base alle proprie esigenze

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

46

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

Si noti che questo funziona immediatamente dopo averlo eseguito. Essa non produce uno script che è necessario incollare da qualche parte (come le 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'. Ciò è necessario se i nomi delle tabelle sono in minuscolo.
ceving il

@ceving bello saperlo! Uso solo tabelle maiuscole, quindi non l'ho mai riscontrato.
kazanaki,

+1 @ceving è necessario anche nel caso in cui il nome della tua tabella sia una parola riservata. Inoltre, aggiungerei PURGEalla fine della DROPdichiarazione.
Грозный,

Risolte le virgolette come suggerito dal ceving.
kazanaki,

ORA-24005: Utilità non
appropriate

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

Il modo più semplice è eliminare l'utente che possiede gli oggetti con il comando a cascata.

DROP USER username CASCADE

5
Questo non è il metodo giusto. Questo è un metodo per eliminare un utente quando l'utente ha creato oggetti, che richiede l'utilizzo di CASCADE per eliminare le tabelle utente appena prima che l'utente venga eliminato. L'eliminazione dell'utente non è la domanda che ha posto.
Djangofan,

3
Raggiunge l'obiettivo in modo molto efficace, 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 soluzioni che favoriscano una relazione con il tuo DBA, in particolare se non hai i privilegi di DBA.
Brian,

2
@Brian pensi che tu abbia torto. A volte non esiste affatto un DBA o fa parte di un'altra società. O il caso più comune: non ti darà accesso per fare ciò di cui hai bisogno.
kazanaki,

Essere nuovo su Oracle e ho più familiarità con MySQL; il ripristino di un DB sembra difficile. IN MySQL a USERè separato da a DATABASE. DROP USER username CASCADEha funzionato per me. Ma in MySQL tutto ciò che dovrei fare è DROP DATABASEcrearne uno nuovo
gawpertron,

1
Questo è efficace per eliminare l'intero database comprese le tabelle se si dispone di 1) uno script "CREA UTENTE" a portata di mano con tutte le autorizzazioni esatte per ricreare il database; e 2) permesso di eseguire quello script. Se tutto ciò che devi fare è eliminare le tabelle, gli altri approcci citati (@kazanaki) sono più appropriati.
Rana Ian,

7

Il modo più semplice sarebbe quello di rilasciare il tablespace e quindi creare il backup del tablespace. Ma preferirei non farlo. Questo è simile a quello di Henry, tranne per il fatto che eseguo una copia / incolla sul gruppo di risultati nella mia interfaccia grafica.

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 è una tabella di sistema che contiene tutte le tabelle dell'utente, la clausola SELECT genererà un'istruzione DROP per ogni tabella in cui è possibile eseguire lo script


non dimenticare le virgolette, altrimenti non puoi eliminare le tabelle con lettere minuscole
masterxilo

2

Per rimuovere tutti gli oggetti in Oracle:

1) dinamico

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) statico

    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

Seguire i passaggi seguenti.

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.