Як скинути всі таблиці користувачів?


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
це залежить від того, що ви мали намір зробити. ви також можете використовувати каскад користувача drop, але вам потрібно знову створити користувача.
Генрі Гао

1
Це працювало дуже добре, і це не вимагає, щоб я мав повноваження на сервері Oracle видаляти та повторно додавати свого користувача. Браво. Чудова відповідь.
djangofan

Я отримую java.lang.IllegalArgumentException: для виконання не вибрано SQL. Моя ідея, що cur_rec не оголошено. Як це оголосити, оскільки це частина складається з bject_name, object_type?
ляпа гребля

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заяви.
Грозный

Виправлено цитати, як пропонується.
казанакі

ORA-24005: Невідповідні утиліти, які використовуються для виконання DDL на таблиці AQ
Skylar Saveland


12

Найпростіший спосіб - скинути користувача, який володіє об'єктами, за допомогою команди каскад.

DROP USER username CASCADE

5
Це не правильний метод. Це метод для видалення користувача, коли користувач створив об’єкти, для чого потрібно використовувати CASCADE для видалення таблиць користувача безпосередньо перед тим, як користувач буде видалений. Видалення користувача - це не питання, яке він задав.
djangofan

3
Це досягає мети дуже ефективно, зокрема, якщо схема є великою. Схоже, у вашому випадку важливим пріоритетом є уникнення будь-якого спілкування з вашою DBA. Я віддаю перевагу рішенням, що сприяють розвитку відносин з вашою DBA - зокрема, якщо у вас немає привілеїв DBA.
Брайан

2
@Brian ви вважаєте неправильним. Іноді взагалі немає DBA або він знаходиться в іншій компанії. Або самий звичайний випадок - він не дасть вам доступу робити те, що вам потрібно.
казанакі

Будучи новинкою в Oracle і я більше знайомий з MySQL; перезавантаження БД здається важким. IN MySQL a USERє окремим до a DATABASE. DROP USER username CASCADEпрацював на мене. Але в MySQL все, що мені потрібно було б зробити, це DROP DATABASEстворити новий
gawpertron

1
Це ефективно для того, щоб скинути всю базу даних, включаючи таблиці, якщо у вас є 1) сценарій "СТВОРИТИ КОРИСТУВАЧ", зручний для всіх точних дозволів на відтворення бази даних; та 2) дозвіл на запуск цього сценарію. Якщо все, що вам потрібно зробити, це скинути таблиці, то інші згадані підходи (@kazanaki) є більш підходящими.
Рана Ян

7

Найпростішим способом було б скинути простір таблиць, а потім створити резервну копію простору. Але я б не хотів цього робити. Це схоже на Генрі, за винятком того, що я просто роблю копію / вставку на набір результатів у своєму 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 являє собою системну таблицю, яка містить усі таблиці користувача, пункт SELECT генерує оператор DROP для кожної таблиці, з якої можна запустити сценарій


не забувайте цитати, інакше ви не можете видалити таблиці з малих літер
masterxilo

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.