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


답변:


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.