2015-04-28 16 views
12

È possibile eliminare tutti i contenuti nello schema in Oracle? Ho trovato questo script:Elimina tutto il contenuto in uno schema in Oracle

Begin 
for c in (select table_name from user_tables) loop 
execute immediate ('drop table '||c.table_name||' cascade constraints); 
end loop; 
End; 

Ma vorrei sapere se ci sono qualche cosa di mollare tutto nello schema, indici, tabelle, vincoli ... ma non lo schema (utente goccia ...).

Grazie.

+0

Se vuoi dire non eliminare gli ID utente Oracle, penso che lo script avrebbe fatto. Ma crea un database di test e provalo. – CargoMeister

+0

Qual è il tuo obiettivo? Per cancellare il contenuto di tutte le tabelle? Quindi non dovresti lasciarli cadere. Se vuoi solo ottenere uno schema vuoto, suppongo sia più facile ricrearlo. Riceverai un nuovo schema da zero con statistiche vuote, senza alcun oggetto (tabelle, viste, sinonimi, viste materializzate, ecc.) – denied

+2

Non ho i permessi per creare utenti, quindi non posso lasciar cadere l'utente e ricrearlo (non posso usare DROP USER come viene commentato nella domanda) – zerosssa

risposta

22

Normalmente, è più semplice eliminare e aggiungere l'utente. Questo è il metodo preferito se si ha accesso a sistema o sysdba al database.

Se non si dispone dell'accesso al livello di sistema e si desidera eseguire lo scrub del proprio schema, il seguente sql produrrà una serie di istruzioni di rilascio, che possono essere quindi eseguite.

select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';' from user_objects 

Quindi, di solito spurgo il cestino per pulire davvero tutto. Per essere onesti, non vedo un sacco di utilizzare per il cestino di Oracle, e vorrei poter disabilitarlo, ma in ogni caso:

purge recyclebin; 

Questo produrrà un elenco di istruzioni goccia. Non tutti verranno eseguiti - se cadi con cascade, il drop degli indici PK_ * fallirà. Ma alla fine, avrai uno schema abbastanza pulito. Confermare con:

select * from user_objects 

Inoltre, solo per aggiungere, il blocco PL/SQL nella tua domanda cancellerà solo le tabelle, non elimina tutti gli altri oggetti.

ps: copiato da qualche sito Web, mi è stato utile. Testato e funzionante come un fascino.

+0

Modifica per mettere il punto e virgola alla fine di ogni goccia: selezionare 'rilascia' || object_type || ' '|| object_name || DECODE (OBJECT_TYPE, 'TABLE', 'CASCADE COSTITUITI', '') || ';' da user_objects – rr789

+0

questa risposta è incompleta per schemi più sofisticati – Pancho

2

Sì, è possibile. È possibile rilasciare l'utente e quindi rilasciare gli oggetti dello schema. L'istruzione DROP USER viene utilizzata per rimuovere un utente dal database Oracle e rimuovere tutti gli oggetti di proprietà di tale utente.

DROP USER TestDB; 

Questa dichiarazione verrà eseguito correttamente solo e rilasciare l'utente chiamato TestDB solo se TestDB non possiede oggetti nel suo schema. Oggetto nelle tabelle di senso e le viste ecc Se contiene oggetti poi dopo l'esecuzione l'istruzione DROP USER si otterrà il seguente messaggio di errore

Error starting at line : 1 in command - 
DROP USER TestDB 
Error report - 
SQL Error: ORA-01922: CASCADE must be specified to drop 'TESTDB' 
01922. 00000 - "CASCADE must be specified to drop '%s'" 
*Cause: Cascade is required to remove this user from the system. The 
      user own's object which will need to be dropped. 
*Action: Specify cascade. 

Se TestDB ha fatto propri oggetti nel suo schema, si avrebbe bisogno di correre la seguente dichiarazione UTENTE GOCCIA invece:

DROP USER TestDB CASCADE; 

Questa dichiarazione scenderà tutti gli oggetti di proprietà di testDB, e tutti i vincoli di integrità referenziale sugli oggetti testdb sarebbe anche lasciato cadere.

+4

Questo è ** esplicitamente ** ciò che l'OP ha fatto ** non ** chiedere. – zb226

0

Il seguente SQLplus script genera le istruzioni SQL necessarie per eliminare tutti gli oggetti dello schema da parte dell'utente desiderato:

set heading off 
set pagesize 0 
set feedback off 

-- wipe out all scheduler jobs 
select 'exec dbms_scheduler.drop_job(job_name => '''||j.job_creator||'.'||j.job_name||''');' 
from user_scheduler_jobs j 
/

-- wipe out all XML schemas 
select 'exec dbms_xmlschema.deleteSchema(schemaURL => '''||s.qual_schema_url||''',delete_option => dbms_xmlschema.DELETE_CASCADE_FORCE);' 
from user_xml_schemas s 
/

-- wipe out all remaining objects 
select 'drop ' 
     ||o.object_type 
     ||' '||object_name 
     ||case o.object_type when 'TABLE' then ' cascade constraints' when 'TYPE' then ' force' else '' end 
     ||';' 
from user_objects o 
where o.object_type not in ('JOB','LOB','PACKAGE BODY','INDEX','TRIGGER') 
and not exists (select 1 
       from user_objects r 
       where r.object_name = o.object_name 
       and r.object_type = 'MATERIALIZED VIEW' 
       and o.object_type != 'MATERIALIZED VIEW' 
       ) 
/

-- empty the recycle bin 
select 'purge recyclebin;' from dual 
/

Lo script funziona al 100% per me, come è - ma se per qualche motivo non è completa per poi è facilmente migliorata utilizzando una macchina virtuale (VM) come segue:

  1. Accedere come [l'utente dello schema per svuotare]
  2. Prendete una fotografia istantanea del vostro VM
  3. eseguire lo script sopra per creare le istruzioni di cancellazione
  4. eseguire le istruzioni di cancellazione (è possibile ignorare eventuali errori "non esiste", poiché alcuni oggetti verranno automaticamente rimossi prima dell'istruzione di rimozione dello script. Ciò si verifica a causa del possesso di oggetti da rimuovere)
  5. log off
  6. accedere come SYS ed eseguire "trascina utente [l'utente dello schema su vuoto];" - SENZA l'opzione cascade

Se il passaggio 6 non riesce, è necessario identificare gli oggetti rimanenti che impediscono l'eliminazione dell'utente e aggiungerli allo script precedente. Ripeti fino a quando l'utente non scende (ad esempio lo script è completo) quindi salva il tuo script

Ripristina la tua macchina virtuale sulla tua istantanea e ripeti i passaggi 3 e 4 (utilizzando lo script aggiornato) - e ora dovresti avere un 100% vuoto schema.

0

Questo è quello che ho usato:

set echo off feedback off serverout on 

spool drop_all_objects.sql 

declare l_object varchar2(32000); 

begin 

    for i in (select object_name, object_type from dba_objects where owner='<owner>') loop 

    if i.object_type='JOB' then 

      l_object := 'begin dbms_scheduler.drop_job (job_name => ''<owner>'||i.object_name||'''); end;'; 

elsif i.object_type='PROGRAM' then 

     l_object := 'begin dbms_scheduler.drop_program (program_name => ''<owner>'||i.object_name||'''); end;'; 

elsif i.object_type='RULE' then 

     l_object := 'begin dbms_rule_adm.drop_rule (rule_name => ''<owner>'||i.object_name||''', force => TRUE); end;'; 

elsif i.object_type='RULE SET' then 

     l_object := 'begin dbms_rule_adm.drop_rule_set (rule_set_name => ''<owner>'||i.object_name||''', delete_rules => TRUE); end;'; 

elsif i.object_type='CHAIN' then 

     l_object := 'begin dbms_scheduler.drop_chain (chain_name => ''<owner>'||i.object_name||''', force => TRUE); end;'; 

elsif i.object_type='RULE' then 

     l_object := 'begin dbms_rule_adm.drop_evaluation_context (evaluation_context_name => ''<owner>'||i.object_name||''', force => TRUE); end;'; 

else 

      l_object := 'drop '||i.object_type||'<owner>'||i.object_name||';'; 

end if; 

dbms_output.put_line(i_object); 

dbms_output.put_line('/'); 

end loop; 

end; 

/

@drop_all_objects 
Problemi correlati