2009-05-06 19 views
20

Ich verwende Oracle DB, um mehr als 30 Tabellen zu verwalten, wie kann ich alle Daten aus allen Tabellen löschen? Ich möchte nur die Daten löschen, aber nicht die Tabellen fallen lassen.SQL: Löschen Sie alle Daten aus allen verfügbaren Tabellen

+0

Diese Frage scheint nicht am Thema zu sein, weil es auf dba.stackexchange.com gehört – EJP

Antwort

25

ein Skript generieren zu kürzen (= entfernen Sie alle Zeilen aus) alle Tabellen:

select 'truncate table ' || table_name || ';' from user_tables 

Und dann das Skript ausführen.

+5

Ich habe diese Antwort bearbeitet, tut mir leid, aber die Sache mit all_tables war ziemlich gefährlich. –

+1

sehr saubere Lösung, vielen Dank – Lily

+3

Nur für Neulinge: Beachten Sie, dass 'truncate' nicht transaktional ist, d. H. Es kann nicht zurückgesetzt werden. –

2

Klonen Sie das Schema und dann die alten Tabellen fallen lassen?

+0

+1: Einfachste Lösung bei weitem –

+1

Oder die "echte DBA" Art und Weise es zu tun: Backup der gesamten DB ohne die d ata, und dann baute die DB (... der Server ... vom Motherboard auf; auf); – BCS

+1

@TomH. Wie ist das einfach? Ich bin kein DBA, und es gibt mir keine Ahnung, welche Befehle auszuführen sind. –

4

Der potenzielle Nachteil einer Abschneidung ist, dass sie bei referenziellen Integritätsbedingungen fehlschlagen kann. Daher sollten Sie zuerst die Fremdschlüsseleinschränkungen deaktivieren und anschließend die Einschränkungen abschneiden und dann erneut aktivieren. Das 'Plus' beim Klonen des Schemas (exp und imp) ist, dass Sie auch den Tablespace löschen und neu erstellen können (was Sie tun möchten, wenn Sie physischen Speicherplatz nach dem Entfernen aller Daten zurückgewinnen möchten) .

18

die Frage der Einschränkungen zu begegnen, so etwas wie dies funktionieren soll:

BEGIN 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS'; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS'; 
    END LOOP; 
END; 
+1

'Alter Tisch ...disable all constraints 'löst eine ORA-01735: ungültige ALTER TABLE-Option aus, wenn für die Tabelle keine Einschränkung definiert ist, die dazu führen würde, dass das Skript * jede * Tabelle nicht abschneiden kann, wenn mindestens eine Tabelle ohne Einschränkung vorhanden ist. Sie könnten das 'execute sofort 'in einen' begin .. exception'-Block einfügen. –

30

Es gibt keinen Befehl

'ALTE TABLE XXX DISABLE alle Constraints' ist schlage ich vor, diese;

BEGIN 
    FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R') 
    LOOP 
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' disable constraint ' || c.constraint_name); 
    END LOOP; 
    FOR c IN (SELECT table_name FROM user_tables) 
    LOOP 
    EXECUTE IMMEDIATE ('truncate table ' || c.table_name); 
    END LOOP; 
    FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R') 
    LOOP 
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' enable constraint ' || c.constraint_name); 
    END LOOP; 
END; 
+2

Diese Lösung ist wahrscheinlich nicht die am meisten gewählt, weil die Menschen nicht alle Antworten hier lesen möchten. –

-3

diese zweizeilige Skript sind die besten

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 
+2

Das ist die einfachste Möglichkeit, alle Tabellen in einer Microsoft SQL Server-Datenbank zu kürzen. Selbst wenn Sie vergessen haben, Einschränkungen nach dem Entfernen von Daten wieder zu aktivieren. Aber ... diese Frage betrifft Oracle ... nicht SQL Server. – K4timini

0

aus allen Tabellen in Oracle alle Daten löschen

DECLARE 
    str VARCHAR2(100); 
BEGIN 
    FOR i IN 
    (SELECT object_name FROM user_objects WHERE object_type='TABLE' 
) 
    LOOP 
    str := 'Truncate table '|| i.object_name; 
    EXECUTE IMMEDIATE str; 
    DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name); 
    END LOOP; 
END;

Für weitere Informationen: http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html

1

Ich habe diese gespeicherte proc, unter Verwendung der oben genannten Antworten. Dies funktioniert perfekt ohne irgendwelche Fehler oder Ausnahmen.

create or replace PROCEDURE DELETE_ALL_DATA 
AS 
cursor r1 is select * from user_constraints; 
cursor r2 is select * from user_tables; 
cursor r3 is select * from user_constraints; 
cursor r4 is select * from user_tables; 

BEGIN 

    FOR c1 IN r1 
    loop 
    for c2 in r2 
    loop 
     begin 
     if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN 
     dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name); 
     end if; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    end loop; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     begin 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    END LOOP; 

    FOR c1 IN r3 
    loop 
    for c2 in r4 
    loop 
     begin 
     if c1.table_name = c2.table_name and c1.status = 'DISABLED' THEN 
     dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' enable constraint ' || c1.constraint_name); 
     end if; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    end loop; 
    END LOOP; 

    commit; 
END DELETE_ALL_DATA; 
0

Eine leichte Abwandlung Antwort Andomar die alle Tabellen für einen bestimmten Benutzer die des aktuellen Benutzers statt nur zu kürzen:

SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema' 

Ersetzen Sie die user/schema Bit oben mit dem Namen des Benutzers/schema (zwischen den Anführungszeichen) Sie sind interessiert.

Verwandte Themen