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

123

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

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

  • 0
    Как насчет снятия ограничений вместо их отключения?
  • 0
    dbasupport.com/forums/...
Теги:
constraints
sql-drop

6 ответов

215
Лучший ответ
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                     FROM user_objects
                    WHERE object_type IN
                             ('TABLE',
                              '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;
END;
/
  • 1
    это зависит от того, что вы намеревались сделать. Вы также можете использовать опущенный пользовательский каскад, но вам нужно заново создать пользователя.
  • 1
    Это сработало очень хорошо, и мне не нужны полномочия на сервере Oracle для удаления и повторного добавления моего пользователя. Браво. Отличный ответ.
Показать ещё 5 комментариев
166

Если вам просто нужен действительно простой способ сделать это. Heres a script, который я использовал в прошлом

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')
37

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

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

  • 1
    Это работает для меня, но мне пришлось процитировать имя таблицы, написав 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS' . Это необходимо, если имена таблиц строчные.
  • 0
    @ очень приятно это знать! Я использую только заглавные таблицы, поэтому я никогда не сталкивался с этим.
Показать ещё 4 комментария
20
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;
  • 0
    Самый простой способ отбросить всю таблицу в схеме .....
9

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

DROP USER username CASCADE
  • 5
    Это не правильный метод. Это метод удаления пользователя, когда пользователь создал объекты, который требует использования CASCADE для удаления пользовательских таблиц непосредственно перед удалением пользователя. Удаление пользователя не тот вопрос, который он задал.
  • 3
    Это действительно очень эффективно, особенно если схема большая. Похоже, что в вашем случае исключение любого общения с вашим администратором базы данных является высоким приоритетом. Я предпочитаю решения, которые поддерживают отношения с вашим администратором баз данных, особенно если у вас нет привилегий администратора баз данных.
Показать ещё 3 комментария
4

Самый простой способ - сбросить табличное пространство, а затем создать резервное копирование табличного пространства. Но я не хочу этого делать. Это похоже на Генри, за исключением того, что я просто делаю копию/пасту на наборе результатов в моем 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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню