programing

SQL: 사용 가능한 모든 테이블에서 모든 데이터 삭제

minimums 2023. 6. 17. 08:54
반응형

SQL: 사용 가능한 모든 테이블에서 모든 데이터 삭제

오라클 DB를 사용하여 30개 이상의 테이블을 유지 관리하고 있는데, 모든 테이블에서 모든 데이터를 삭제하려면 어떻게 해야 합니까?데이터만 삭제하고 테이블은 삭제하지 않습니다.

'ALTER TABLE XXX DISABLE ALL CONSTARINGS' 명령이 없습니다.

이렇게 제안합니다.

BEGIN
  FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
  LOOP
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' disable constraint ' || c.constraint_name);
  END LOOP;
  FOR c IN (SELECT table_name FROM user_tables)
  LOOP
    EXECUTE IMMEDIATE ('truncate table ' || c.table_name);
  END LOOP;
  FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
  LOOP
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' enable constraint ' || c.constraint_name);
  END LOOP;
END;

모든 테이블을 잘라낼 스크립트 생성(= 모든 행 제거):

select 'truncate table ' || table_name || ';' from user_tables

그런 다음 스크립트를 실행합니다.

제약 조건 문제를 해결하려면 다음과 같은 작업이 수행되어야 합니다.

BEGIN

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS';
    END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
    END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS';
    END LOOP;
END;

잘라내기의 잠재적인 단점은 참조 무결성 제약 조건에서 실패할 수 있다는 것입니다.따라서 먼저 외부 키 제약 조건을 사용하지 않도록 설정한 다음 잘라내기를 수행한 다음 제약 조건을 다시 사용하도록 설정합니다.스키마 복제(expand imp)의 '플러스'는 테이블 공간을 삭제하고 다시 만들 수 있다는 것입니다(모든 데이터를 제거한 결과로 일부 물리적 Disk 공간을 회수하려는 경우 이를 수행할 수 있습니다).

스키마를 복제한 다음 이전 테이블을 삭제하시겠습니까?

저는 위에 언급된 답변을 사용하여 이 저장 프로시저를 만들었습니다.이것은 오류나 예외 없이 완벽하게 작동합니다.

    create or replace PROCEDURE DELETE_ALL_DATA
AS 
cursor r1 is select * from user_constraints;
cursor r2 is select * from user_tables;
cursor r3 is select * from user_constraints;
cursor r4 is select * from user_tables;

BEGIN

    FOR c1 IN r1
  loop
    for c2 in r2
    loop
        begin
       if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name);
       end if;
        EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    end loop;
  END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      begin
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
      EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    END LOOP;

    FOR c1 IN r3
  loop
    for c2 in r4
    loop
        begin
       if c1.table_name = c2.table_name and c1.status = 'DISABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' enable constraint ' || c1.constraint_name);
       end if;
        EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    end loop;
  END LOOP;

    commit;
END DELETE_ALL_DATA;

현재 사용자의 테이블만 잘라내는 대신 특정 사용자의 테이블을 모두 잘라내는 Andomar의 답변에 약간의 변화가 있습니다.

SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema'

교체합니다.user/schema관심 있는 사용자/사용자의 이름(따옴표 사이)을 입력합니다.

오라클의 모든 테이블에서 모든 데이터 삭제

선언하다str VARCHAR2(100);시작한다.FOR i IN(object_name은 user_message WHERE object_type=에서 선택하십시오.'표')고리str := '테이블 잘라내기' || i.object_name;즉시 str을 실행합니다;DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name);
END 루프;끝;

자세한 내용은 http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html 에서 확인하시기 바랍니다.

이 두 줄 스크립트가 최고입니다.

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

EXEC sp_MSForEachTable 'DELETE FROM ?'
GO

언급URL : https://stackoverflow.com/questions/832160/sql-delete-all-the-data-from-all-available-tables

반응형