Как удалить все пользовательские таблицы?


160

Как я могу удалить все пользовательские таблицы в Oracle?

У меня проблема с ограничениями. Когда я отключаю все это по-прежнему невозможно.


Как насчет снятия ограничений вместо их отключения?
Дэвид Олдридж

Ответы:


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
это зависит от того, что вы намеревались сделать. Вы также можете использовать опущенный пользовательский каскад, но вам нужно заново создать пользователя.
Генри Гао

1
Это сработало очень хорошо, и мне не нужны полномочия на сервере Oracle для удаления и повторного добавления моего пользователя. Браво. Отличный ответ.
Джангофан

Я получаю java.lang.IllegalArgumentException: SQL не выбран для выполнения .. Моя идея заключается в том, что cur_rec не объявлен. Как объявить это, так как он состоит из bject_name, object_type?
lijep dam

3
Я думаю, что сценарий может быть опасным. Если вы подключены как SYSDBA, то он удаляет ВСЕ таблицы ВСЕХ пользователей, а также ВСЕ системные таблицы. На практике вы удаляете всю БД. Быть осторожен!
Зардо

Это полезно для пользователей, имеющих разрешение на определенную схему, но не разрешение dba в среде разработки.
Генри Гао

201

Если вы просто хотите действительно простой способ сделать это .. Вот сценарий, который я использовал в прошлом

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

Это выведет серию команд удаления для всех таблиц в схеме. Подпишите результат этого запроса и выполните его.

Источник: https://forums.oracle.com/forums/thread.jspa?threadID=614090.

Аналогично, если вы хотите очистить не только таблицы, вы можете отредактировать следующее в соответствии со своими потребностями.

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

46

Другой ответ, который сработал для меня (кредит 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;

Обратите внимание, что это работает сразу после запуска. Он НЕ производит сценарий, который нужно вставить куда-то (как и другие ответы здесь). Он работает прямо на БД.


1
Это работает для меня, но я должен был процитировать название таблицы, написав 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Это необходимо, если имена таблиц строчные.
ceving

@ очень приятно это знать! Я использую только заглавные таблицы, поэтому я никогда не сталкивался с этим.
Казанаки

+1 @ceving также нужно в случае, если ваше имя таблицы является зарезервированным словом. Кроме того, я бы добавил PURGEв конце DROPзаявления.
Грозный

Исправлены цитаты в соответствии с предложенным ceving.
Казанаки

ORA-24005: неподходящие утилиты, используемые для выполнения DDL на столе AQ
Skylar Saveland


12

Самый простой способ - удалить пользователя, которому принадлежат объекты, с помощью команды cascade.

DROP USER username CASCADE

5
Это не правильный метод. Это метод удаления пользователя, когда пользователь создал объекты, который требует использования CASCADE для удаления пользовательских таблиц непосредственно перед удалением пользователя. Удаление пользователя не тот вопрос, который он задал.
Джангофан

3
Он очень эффективно выполняет задачу, особенно если схема большая. Похоже, что в вашем случае исключение любого общения с вашим администратором базы данных является высоким приоритетом. Я предпочитаю решения, которые способствуют отношениям с вашим администратором баз данных, особенно если у вас нет привилегий администратора баз данных.
Брайан

2
@ Брайан, ты ошибаешься. Иногда нет вообще никакого DBA, или он находится в другой компании. Или самый обычный случай - он не даст вам доступа к тому, что вам нужно.
Казанаки

Будучи новичком в Oracle, я больше знаком с MySQL; Сброс БД кажется трудным. В MySQL а USERявляется отдельным для DATABASE. DROP USER username CASCADEработал на меня. Но в MySQL все, что мне нужно сделать, это DROP DATABASEсоздать новый
gawpertron

1
Это эффективно для удаления всей базы данных, включая таблицы, если у вас есть 1) сценарий «CREATE USER», удобный со всеми точными разрешениями для воссоздания базы данных; и 2) разрешение на запуск этого скрипта. Если все, что вам нужно сделать, это удалить таблицы, то другие упомянутые подходы (@kazanaki) являются более подходящими.
Рана Ян

7

Самый простой способ - сбросить табличное пространство, а затем восстановить его. Но я бы предпочел не делать этого. Это похоже на Генри за исключением того, что я просто копирую / вставляю набор результатов в моем графическом интерфейсе.

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 системная таблица, которая содержит все таблицы пользователя. Предложение SELECT будет генерировать оператор DROP для каждой таблицы, в которой вы можете запустить скрипт


не забудьте
про

2

Чтобы удалить все объекты в Oracle

1) Динамический

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) Статическое

    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

Пожалуйста, следуйте инструкциям ниже.

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.