source

Oracle에서 모든 사용자 테이블/시퀀스 삭제

manycodes 2023. 3. 12. 10:58
반응형

Oracle에서 모든 사용자 테이블/시퀀스 삭제

빌드 프로세스와 데이터베이스 진화의 일환으로 사용자의 모든 테이블과 시퀀스를 삭제하는 스크립트를 작성하려고 합니다.이 경우 허용된 것보다 더 많은 권한이 필요하므로 사용자를 다시 만들고 싶지 않습니다.

이 스크립트는 테이블/시퀀스를 삭제하는 절차를 작성하고 절차를 실행한 후 절차를 삭제합니다.sqlplus에서 파일을 실행하고 있습니다.

drop.sql:


create or replace procedure drop_all_cdi_tables
is
cur integer;
begin
cur:= dbms_sql.OPEN_CURSOR();
for t in (select table_name from user_tables) loop
execute immediate 'drop table ' ||t.table_name|| ' cascade constraints';
end loop;
dbms_sql.close_cursor(cur);

cur:= dbms_sql.OPEN_CURSOR();
for t in (select sequence_name from user_sequences) loop
execute immediate 'drop sequence ' ||t.sequence_name;
end loop;
dbms_sql.close_cursor(cur);
end;
/
execute drop_all_cdi_tables;
/
drop procedure drop_all_cdi_tables;
/

유감스럽게도 절차를 취소하면 문제가 발생합니다.레이스 상태가 발생하고 실행 전에 프로시저가 폐기됩니다.
예:

SQL*Plus: Release 11.1.0.7.0 - 2010년 3월 30일 (화) 18:45:42
Copyright (c) 1982, 2008, Oracle.무단 전재 금지.


연결처:Oracle Database 11g Enterprise Edition 릴리스 11.1.0.7.0 - 64비트 프로덕션파티셔닝, OLAP, 데이터 마이닝 및 실제 애플리케이션 테스트 옵션 사용

프로시저가 작성되었습니다.


PL/SQL 절차가 완료되었습니다.


프로시저가 작성되었습니다.


프로시저가 폐기되었습니다.

드롭 프로시저 drop_all_user_drop*1행 오류:ORA-04043: 객체 DROP_ALL_USER_TABLES가 존재하지 않습니다.

Oracle Database 11g Enterprise Edition 릴리스 11.1.0.7.0 - 64에서 절단됨파티셔닝, OLAP, 데이터 마이닝 및 실제 애플리케이션 테스트 옵션 사용

어떻게 해야 할지 생각나는 거 없어?

저장 프로시저를 유지할 생각이 없다면 익명 PLSQL 블록을 사용합니다.

BEGIN

  --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;

END;

SQL 문의 경우 마지막에 있는 세미콜론이 문을 실행합니다./는 이전 문을 실행합니다.그 결과, 최종 라인은

drop procedure drop_all_cdi_tables;
/

프로시저를 파기하고 다시 파기합니다.

출력을 보면 'PROCEDURE CREATED'가 표시되고, 그 다음 'PROCEDURE CREATED'가 다시 실행되며(EXECUTE는 SQL*Plus 명령어이므로 버퍼링되지 않음), 'PROCEDURE DROPED'가 두 번째 드롭을 시도합니다(실패).

추신. Dougman의 홀수 DBMS_SQL 호출에 동의합니다.

다음 두 개의 문을 실행하고 모든 결과를 실행합니다.

select 'drop table ' || table_name || ';' from user_tables;
select 'drop sequence ' || sequence_name || ';' from user_sequences;

되는 것 .drop_all_user_tables, 예를 는 '예'에 대한 것입니다.drop_all_cdi_tablesdrop_all_user_tables코드가 달라보입니까?

,, 화, 화, 습, 습, 습, 습, 습, also, also, also, also.dbms_sql이치

OMG Pones가 제공하는 솔루션 외에 공백이 있는 시퀀스가 있는 경우 PLSQL을 약간 확장해야 합니다.

BEGIN
  FOR i IN (SELECT sequence_name FROM user_sequences)
    Loop
      EXECUTE IMMEDIATE('"DROP SEQUENCE ' || user || '"."' || i.sequence_name || '"');
    End Loop;
End;
/

어떤 이유로 OMG Pornes 솔루션이 PLSQL에서 "SQL command not ended" 오류를 발생시켰습니다.다른 사람에게 같은 문제가 발생했을 경우에 대비하여 현재 스키마의 모든 테이블을 삭제할 수 있는 방법을 알려드립니다.

DECLARE
  table_name VARCHAR2(30);
  CURSOR usertables IS SELECT * FROM user_tables WHERE table_name NOT LIKE 'BIN$%';
BEGIN
  FOR i IN usertables
  LOOP
  EXECUTE IMMEDIATE 'drop table ' || i.table_name || ' cascade constraints';
  END LOOP;
END;
/

크레딧: 스니플러

언급URL : https://stackoverflow.com/questions/2549718/dropping-all-user-tables-sequences-in-oracle

반응형