Jak usunąć wszystkie tabele użytkowników?


Odpowiedzi:


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
zależy to od tego, co zamierzasz zrobić. możesz również użyć kaskady upuszczania użytkowników, ale musisz ponownie utworzyć użytkownika.
Henry Gao

1
Działało to bardzo dobrze i nie wymaga posiadania uprawnień na serwerze Oracle do usuwania i ponownego dodawania mojego użytkownika. Brawo. Świetna odpowiedź.
djangofan

Otrzymuję java.lang.IllegalArgumentException: Nie wybrano kodu SQL do wykonania .. Mój pomysł jest taki, że cur_rec nie jest zadeklarowany. Jak to zadeklarować, skoro jest to część składająca się z nazwa_obiektu, typ_obiektu?
tama lijep

3
Myślę, że scenariusz może być niebezpieczny. Jeśli jesteś połączony jako SYSDBA, to usuwa WSZYSTKIE tabele WSZYSTKICH użytkowników, a także WSZYSTKIE tabele systemowe. W praktyce usuwasz całą bazę danych. Bądź ostrożny!
Zardo

Jest to przydatne dla użytkowników, którzy mają uprawnienia do określonego schematu, ale nie mają uprawnienia dba w środowisku programistycznym.
Henry Gao

201

Jeśli potrzebujesz naprawdę prostego sposobu na zrobienie tego ... Oto skrypt, którego używałem w przeszłości

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

Spowoduje to wydrukowanie serii poleceń upuszczania dla wszystkich tabel w schemacie. Buforuj wynik tego zapytania i wykonaj go.

Źródło: https://forums.oracle.com/forums/thread.jspa?threadID=614090

Podobnie, jeśli chcesz wyczyścić więcej niż tabele, możesz edytować następujące elementy, aby dostosować je do swoich potrzeb

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

46

Inna odpowiedź, która mi pomogła, to (źródło: 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;

Zauważ, że działa to natychmiast po uruchomieniu. Robi NIE produkować skrypt, który trzeba wkleić gdzieś (jak innych odpowiedzi tutaj). Działa bezpośrednio na DB.


1
To działa dla mnie, ale musiałem zacytować nazwę tabeli, pisząc 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Jest to konieczne, jeśli nazwy tabel są zapisane małymi literami.
ceving

@ceving miło to wiedzieć! Używam tylko tabel z dużymi literami, więc nigdy tego nie spotkałem.
kazanaki

+1 @ceving jest również potrzebne na wypadek, gdyby nazwa twojego stołu była słowem zastrzeżonym. Dodałbym też PURGEna końcu DROPoświadczenia.
Грозный

Poprawiono cytaty zgodnie z sugestią ceving.
kazanaki

ORA-24005: Niewłaściwe narzędzia używane do wykonywania DDL na stole AQ
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;

12

Najprostszym sposobem jest usunięcie użytkownika będącego właścicielem obiektów za pomocą polecenia kaskada.

DROP USER username CASCADE

5
To nie jest właściwa metoda. Jest to metoda usuwania użytkownika, gdy użytkownik utworzył obiekty, co wymaga użycia CASCADE do usunięcia tabel użytkownika tuż przed usunięciem użytkownika. Usunięcie użytkownika nie jest pytaniem, które zadał.
djangofan

3
Osiąga cel bardzo skutecznie, zwłaszcza jeśli schemat jest duży. Wygląda na to, że w twoim przypadku unikanie komunikacji z administratorem ma wysoki priorytet. Preferuję rozwiązania, które wspierają relacje z Twoim DBA - szczególnie jeśli nie masz uprawnień DBA.
Brian

2
@Brian źle zakładasz. Czasami w ogóle nie ma administratora lub pracuje w innej firmie. Lub w najbardziej typowym przypadku - nie da ci dostępu do tego, czego potrzebujesz.
kazanaki

Jestem nowy w Oracle i lepiej znam MySQL; resetowanie bazy danych wydaje się trudne. W MySQL a USERjest oddzielny od DATABASE. DROP USER username CASCADEpracował dla mnie. Ale w MySQL wszystko, co musiałbym zrobić, to DROP DATABASEstworzyć nowy
gawpertron

1
Jest to efektywne do usunięcia całej bazy danych, łącznie z tabelami, jeśli masz 1) pod ręką skrypt „CREATE USER” ze wszystkimi dokładnymi uprawnieniami do odtworzenia bazy danych; oraz 2) pozwolenie na uruchomienie tego skryptu. Jeśli wszystko, co musisz zrobić, to upuścić tabele, inne wspomniane podejścia (@kazanaki) są bardziej odpowiednie.
Rana Ian

7

Najłatwiejszym sposobem byłoby porzucenie obszaru tabel, a następnie utworzenie jego kopii zapasowej. Ale wolałbym nie musieć tego robić. Jest to podobne do Henry'ego, z tym wyjątkiem, że po prostu kopiuję / wklejam zestaw wyników w moim 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')

6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables jest tabelą systemową zawierającą wszystkie tabele użytkownika klauzula SELECT wygeneruje instrukcję DROP dla każdej tabeli, którą możesz uruchomić skrypt


nie zapomnij o cudzysłowach, w przeciwnym razie nie możesz usunąć tabel z małymi literami
masterxilo

2

Aby usunąć wszystkie obiekty w oracle:

1) Dynamiczny

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

    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

Wykonaj poniższe kroki.

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.