Протрите данные из БД Oracle - PullRequest
3 голосов
/ 11 ноября 2009

Я запускаю некоторый тест для переноса данных из одной базы данных в другую, и для этого мне нужно удалить и воссоздать те же таблицы, представления и другие вещи. Итак, что такое оператор (ы) SQL в Oracle, чтобы стереть все (удалить таблицы, представления, последовательности, функции, процедуры и т. Д.). Я знаю, что могу использовать «DROP», но иногда это недостаточно удобно.

Спасибо

Ответы [ 5 ]

6 голосов
/ 11 ноября 2009

В тех случаях, когда я не могу просто отбросить схему, я использую следующий скрипт:

DECLARE
CURSOR c_get_objects IS
  SELECT object_type, '"' || object_name || '"' || DECODE(object_type, 'TABLE', ' cascade constraints', NULL) obj_name
    FROM user_objects
   WHERE object_type IN ('TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'SYNONYM', 'MATERIALIZED VIEW')
   ORDER BY object_type;
CURSOR c_get_objects_type IS
  SELECT object_type, '"' || object_name || '"' obj_name FROM user_objects WHERE object_type IN ('TYPE');
BEGIN
FOR object_rec IN c_get_objects
LOOP
  EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name);
END LOOP;
FOR object_rec IN c_get_objects_type
LOOP
  EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name || ' force');
END LOOP;
END;
/
4 голосов
/ 11 ноября 2009

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

DROP USER [schema name] CASCADE

Сбросить его с орбиты - это единственный способ быть уверенным;)

Для предоставленного вами сценария вы могли бы вместо этого выполнить эти запросы, не создавая промежуточный сценарий, используя следующую анонимную процедуру:

BEGIN

  --Bye Views!
  FOR i IN (SELECT uv.view_name
              FROM USER_VIEWS uv) LOOP
    EXECUTE IMMEDIATE 'drop view '|| i.view_name ||'';
  END LOOP;

  --Bye Sequences!
  FOR i IN (SELECT us.sequence_name
              FROM USER_SEQUENCES us) LOOP
    EXECUTE IMMEDIATE 'drop sequence '|| i.sequence_name ||'';
  END LOOP;

  --Bye Tables!
  FOR i IN (SELECT ut.table_name
              FROM USER_TABLES ut) LOOP
    EXECUTE IMMEDIATE 'drop table '|| i.table_name ||' CASCADE CONSTRAINTS ';
  END LOOP;

  --Bye Procedures/Functions/Packages!
  FOR i IN (SELECT us.name,
                   us.type
              FROM USER_SOURCE us
             WHERE us.type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE')
          GROUP BY us.name, us.type) LOOP
    EXECUTE IMMEDIATE 'drop '|| i.type ||' '|| i.name ||'';
  END LOOP;

  --Bye Synonyms!
  FOR i IN (SELECT ut.synonym_name
              FROM USER_SYNONYMS us
             WHERE us.synonym_name NOT LIKE 'sta%' 
               AND us.synonym_name LIKE 's_%') LOOP
    EXECUTE IMMEDIATE 'drop synonym '|| i.synonym_name ||'';
  END LOOP;

END;
1 голос
/ 11 ноября 2009

Я нашел этот скрипт , где вы можете сгенерировать скрипт для удаления всего, но было бы здорово, если бы я использовал что-то общее.

set feedback off
set pagesize 0
spool AllObjectsDrop.sql
select 'drop view '||view_name||';' from user_views;
select distinct 'drop sequence '||sequence_name|| ';'from user_sequences;
select distinct 'drop table '||table_name|| ';'from user_tables;
select distinct 'drop procedure '||name|| ';'from user_source where type = 'procedure';
select distinct 'drop function '||name|| ';'from user_source where type = 'function';
select distinct 'drop package '||name|| ';'from user_source where type = 'package';
select 'drop synonym '||synonym_name||';' from user_synonyms where synonym_name not like 'sta%' and synonym_name like 's_%'
spool off
1 голос
/ 11 ноября 2009

Если у вас Enterprise Edition, вы должны изучить точки восстановления и базу данных Flashback .

DROP USER ... CASCADE хорош, если у вас есть привилегии и быстрый скрипт для воссоздания пользователя.

0 голосов
/ 11 ноября 2009

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

Таким образом, у меня все возвращается на круги своя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...