Wie lösche ich alle Benutzertabellen?

160

Wie kann ich alle Benutzertabellen in Oracle ablegen?

Ich habe Probleme mit Einschränkungen. Wenn ich alles deaktiviere, ist es immer noch nicht möglich.

Szaman
quelle
Wie wäre es, die Einschränkungen zu löschen, anstatt sie zu deaktivieren?
David Aldridge

Antworten:

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
quelle
1
Es hängt davon ab, was Sie vorhaben. Sie können auch die Drop-User-Kaskade verwenden, müssen den Benutzer jedoch neu erstellen.
Henry Gao
1
Dies hat sehr gut funktioniert und erfordert nicht, dass ich auf dem Oracle-Server berechtigt bin, meinen Benutzer zu löschen und erneut hinzuzufügen. Bravo. Gute Antwort.
Djangofan
Ich erhalte java.lang.IllegalArgumentException: Kein SQL zur Ausführung ausgewählt. Meine Idee ist, dass cur_rec nicht deklariert ist. Wie kann man es deklarieren, da dies teilweise aus Objektname, Objekttyp besteht?
Lijep Damm
3
Ich denke, das Drehbuch könnte gefährlich sein. Wenn Sie als SYSDBA verbunden sind, werden ALLE Tabellen ALLER Benutzer sowie ALLE Systemtabellen gelöscht. In der Praxis löschen Sie die gesamte Datenbank. Achtung!
Zardo
Dies ist nützlich, wenn Benutzer über eine Berechtigung für ein bestimmtes Schema verfügen, nicht jedoch über die Berechtigung dba in der Entwicklungsumgebung.
Henry Gao
201

Wenn Sie nur einen wirklich einfachen Weg wollen, dies zu tun. Hier ist ein Skript, das ich in der Vergangenheit verwendet habe

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

Dadurch wird eine Reihe von Drop-Befehlen für alle Tabellen im Schema ausgedruckt. Spoolen Sie das Ergebnis dieser Abfrage und führen Sie es aus.

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

Wenn Sie mehr als nur Tabellen löschen möchten, können Sie Folgendes entsprechend Ihren Anforderungen bearbeiten

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

Eine andere Antwort, die für mich funktioniert hat, ist (Dank an 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;

Beachten Sie, dass dies sofort nach dem Ausführen funktioniert . Es wird KEIN Skript erstellt, das Sie irgendwo einfügen müssen (wie andere Antworten hier). Es läuft direkt in der DB.

Kazanaki
quelle
1
Das funktioniert bei mir, aber ich musste den Tabellennamen schriftlich zitieren 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Dies ist erforderlich, wenn die Tabellennamen in Kleinbuchstaben geschrieben sind.
ceving
@ceving schön das zu wissen! Ich verwende nur Großbuchstaben, daher bin ich nie darauf gestoßen.
Kazanaki
+1 @ceving wird auch benötigt, wenn Ihr Tabellenname ein reserviertes Wort ist. Außerdem würde ich PURGEam Ende der DROPErklärung hinzufügen .
Грозный
Die Anführungszeichen wurden wie vorgeschlagen korrigiert.
Kazanaki
ORA-24005: Unangemessene Dienstprogramme zur Durchführung von DDL für AQ-Tabellen
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
quelle
12

Am einfachsten ist es, den Benutzer, dem die Objekte gehören, mit dem Befehl cascade zu löschen.

DROP USER username CASCADE
Brian
quelle
5
Dies ist nicht die richtige Methode. Dies ist eine Methode zum Löschen eines Benutzers, wenn der Benutzer Objekte erstellt hat. Dazu muss CASCADE verwendet werden, um die Benutzertabellen unmittelbar vor dem Löschen des Benutzers zu löschen. Das Löschen des Benutzers ist nicht die Frage, die er gestellt hat.
Djangofan
3
Es erreicht das Ziel sehr effektiv, insbesondere wenn das Schema groß ist. In Ihrem Fall scheint es eine hohe Priorität zu sein, jegliche Kommunikation mit Ihrem DBA zu vermeiden. Ich bevorzuge Lösungen, die eine Beziehung zu Ihrem DBA fördern - insbesondere, wenn Sie keine DBA-Berechtigungen haben.
Brian
2
@ Brian du nimmst falsch an. Manchmal gibt es überhaupt keinen DBA oder er ist in einer anderen Firma. Oder der üblichste Fall - er gibt Ihnen keinen Zugang, um das zu tun, was Sie brauchen.
Kazanaki
Ich bin neu bei Oracle und kenne mich mit MySQL besser aus. Das Zurücksetzen einer Datenbank scheint schwierig zu sein. In MySQL USERist a getrennt von a DATABASE. DROP USER username CASCADEarbeitete für mich. Aber in MySQL müsste ich nur DROP DATABASEein neues erstellen
gawpertron
1
Dies ist effektiv, um die gesamte Datenbank einschließlich der Tabellen zu löschen, wenn Sie 1) ein 'CREATE USER'-Skript zur Hand haben, das alle genauen Berechtigungen zum Neuerstellen der Datenbank enthält; und 2) Erlaubnis, dieses Skript auszuführen. Wenn Sie nur Tabellen löschen müssen, sind andere erwähnte Ansätze (@kazanaki) besser geeignet.
Rana Ian
7

Der einfachste Weg wäre, den Tablespace zu löschen und dann den Tablespace wieder aufzubauen. Aber das müsste ich lieber nicht tun. Dies ist ähnlich wie bei Henry, außer dass ich nur die Ergebnismenge in meiner GUI kopiere / einfüge.

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
quelle
6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables ist eine Systemtabelle, die alle Tabellen des Benutzers enthält. Die SELECT-Klausel generiert eine DROP-Anweisung für jede Tabelle, in der Sie das Skript ausführen können

ANiket Chavan
quelle
Vergessen Sie nicht die Anführungszeichen, sonst können Sie keine Tabellen mit Kleinbuchstaben löschen
masterxilo
2

So entfernen Sie alle Objekte im Orakel:

1) Dynamisch

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

    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
quelle
1

Bitte befolgen Sie die folgenden Schritte.

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
quelle