모든 사용자 테이블을 삭제하는 방법?


답변:


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
그것은 당신이하려는 의도에 달려 있습니다. 드롭 사용자 캐스케이드를 사용할 수도 있지만 사용자를 다시 작성해야합니다.
— Henry Gao

1
이것은 매우 잘 작동했으며 Oracle 서버에서 사용자를 삭제하고 다시 추가 할 권한이 필요하지 않습니다. 브라보. 좋은 대답입니다.
— djangofan

java.lang.IllegalArgumentException : 실행을 위해 선택된 SQL이 없습니다. 내 생각은 cur_rec가 선언되지 않았다는 것입니다. 이것이 bject_name, object_type으로 구성되어 있기 때문에 어떻게 선언합니까?
— lijep dam

3
스크립트가 위험 할 수 있다고 생각합니다. SYSDBA로 연결된 경우 모든 사용자의 모든 테이블과 모든 시스템 테이블을 삭제합니다. 실제로 전체 DB를 삭제합니다. 조심해!
— Zardo

이는 사용자에게 개발 환경의 dba 권한이 아닌 특정 스키마에 대한 권한이있는 경우에 유용합니다.
— Henry Gao

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;

이 기능은 실행 한 직후에 작동 합니다. 어딘가에 붙여 넣을 필요가있는 스크립트를 생성 하지 않습니다 (여기의 다른 답변처럼). DB에서 직접 실행됩니다.


1
이것은 나를 위해 작동하지만 쓰기로 테이블 이름을 인용해야했습니다 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. 테이블 이름이 소문자 인 경우에 필요합니다.
— 분

@ceving 이걸 아는 것이 좋다! 대문자 테이블 만 사용하므로이 문제가 발생하지 않았습니다.
— kazanaki

+1 @ceving은 테이블 이름이 예약어 인 경우에도 필요합니다. 또한 성명서 PURGE끝에 추가하겠습니다 DROP.
— Грозный

제안한대로 인용문을 수정했습니다.
— kazanaki

ORA-24005 : AQ 테이블에서 DDL을 수행하는데 사용되는 부적절한 유틸리티
— 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

가장 간단한 방법은 캐스케이드 명령으로 객체를 소유 한 사용자를 삭제하는 것입니다.

DROP USER username CASCADE

5
이것은 올바른 방법이 아닙니다. 사용자가 오브젝트를 작성할 때 사용자를 삭제하는 방법으로, CASCADE를 사용하여 사용자가 삭제되기 직전에 사용자 테이블을 삭제해야합니다. 사용자를 삭제하는 것은 그가 요구 한 질문이 아닙니다.
— djangofan

3
특히 스키마가 큰 경우 목표를 매우 효과적으로 달성합니다. 귀하의 경우 DBA와의 통신을 피하는 것이 최우선 순위 인 것처럼 보입니다. 특히 DBA 권한이없는 경우 DBA와의 관계를 촉진하는 솔루션을 선호합니다.
— Brian

2
@Brian 당신은 잘못 생각합니다. 때로는 DBA가 전혀 없거나 다른 회사에 있습니다. 또는 가장 일반적인 경우-그는 필요한 것을 할 수있는 권한을 부여하지 않습니다.
— kazanaki

Oracle을 처음 사용하고 MySQL에 익숙합니다. DB 재설정이 어려워 보입니다. MySQL에서 a USER는 a 와 분리됩니다 DATABASE. DROP USER username CASCADE나를 위해 일했다. 그러나 MySQL에서해야 할 일은 DROP DATABASE새로운 것을 만드는 것입니다
— gawpertron

1
이는 1) 데이터베이스를 다시 작성할 수있는 모든 정확한 권한이있는 'CREATE USER'스크립트가있는 경우 테이블을 포함하여 전체 데이터베이스를 삭제하는 데 효과적입니다. 그리고 2) 해당 스크립트를 실행할 수있는 권한. 테이블 삭제 만하면 다른 언급 된 접근 방식 (@kazanaki)이 더 적합합니다.
— Rana Ian

7

가장 쉬운 방법은 테이블 스페이스를 삭제 한 다음 테이블 스페이스를 다시 빌드하는 것입니다. 그러나 나는 그렇게 할 필요가 없습니다. 이것은 내 GUI의 결과 집합에 복사 / 붙여 넣기만한다는 점을 제외하고 Henry의 것과 유사합니다.

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

오라클의 모든 객체를 제거하려면

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.