복붙노트

[SQL] 오라클의 모든 테이블 제약을 해제

SQL

오라클의 모든 테이블 제약을 해제

어떻게 하나의 명령으로 오라클의 모든 테이블 제약을 해제 할 수 있습니다? 이것은 하나의 테이블, 테이블의 목록, 또는 모든 테이블이 될 수 있습니다.

해결법

  1. ==============================

    1.임시 스풀 파일을 작성하지 않도록하는 것이 좋습니다. PL / SQL 블록을 사용합니다. 당신은 SQL * 플러스에서이 작업을 실행하거나 패키지 또는 프로 시저에이 물건을 넣을 수 있습니다. 은 피할보기 제약이 USER_TABLES에 가입 할 수 있습니다.

    임시 스풀 파일을 작성하지 않도록하는 것이 좋습니다. PL / SQL 블록을 사용합니다. 당신은 SQL * 플러스에서이 작업을 실행하거나 패키지 또는 프로 시저에이 물건을 넣을 수 있습니다. 은 피할보기 제약이 USER_TABLES에 가입 할 수 있습니다.

    그것은 당신이 정말로 (등 NOT NULL, 기본 키를 포함하여) 모든 제약 조건을 해제 할 가능성은 적습니다. 당신은 WHERE 절에 CONSTRAINT_TYPE 퍼팅에 대해 생각해야한다.

    BEGIN
      FOR c IN
      (SELECT c.owner, c.table_name, c.constraint_name
       FROM user_constraints c, user_tables t
       WHERE c.table_name = t.table_name
       AND c.status = 'ENABLED'
       AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
       ORDER BY c.constraint_type DESC)
      LOOP
        dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
      END LOOP;
    END;
    /
    

    다시 제약 조건을 사용하면 약간의 잔재주 - 당신은 외래 키 제약 조건을 참조 할 수 있습니다 전에 기본 키 제약 조건을 활성화해야합니다. 이것은 CONSTRAINT_TYPE에 의해 주문을 사용하여 수행 할 수 있습니다. 'P'= 기본 키, 'R'= 외래 키.

    BEGIN
      FOR c IN
      (SELECT c.owner, c.table_name, c.constraint_name
       FROM user_constraints c, user_tables t
       WHERE c.table_name = t.table_name
       AND c.status = 'DISABLED'
       ORDER BY c.constraint_type)
      LOOP
        dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
      END LOOP;
    END;
    /
    
  2. ==============================

    2.에 걸릴 제약과의 종속성을 계산하려면 :

    에 걸릴 제약과의 종속성을 계산하려면 :

    SET Serveroutput ON
    BEGIN
        FOR c IN
        (SELECT c.owner,c.table_name,c.constraint_name
        FROM user_constraints c,user_tables t
        WHERE c.table_name=t.table_name
        AND c.status='ENABLED'
        ORDER BY c.constraint_type DESC,c.last_change DESC
        )
        LOOP
            FOR D IN
            (SELECT P.Table_Name Parent_Table,C1.Table_Name Child_Table,C1.Owner,P.Constraint_Name Parent_Constraint,
                c1.constraint_name Child_Constraint
            FROM user_constraints p
            JOIN user_constraints c1 ON(p.constraint_name=c1.r_constraint_name)
            WHERE(p.constraint_type='P'
            OR p.constraint_type='U')
            AND c1.constraint_type='R'
            AND p.table_name=UPPER(c.table_name)
            )
            LOOP
                dbms_output.put_line('. Disable the constraint ' || d.Child_Constraint ||' (on table '||d.owner || '.' ||
                d.Child_Table || ')') ;
                dbms_utility.exec_ddl_statement('alter table ' || d.owner || '.' ||d.Child_Table || ' disable constraint ' ||
                d.Child_Constraint) ;
            END LOOP;
        END LOOP;
    END;
    /
    
  3. ==============================

    3.그것은 하나의 명령 아니지만, 여기에 내가 그것을 할 방법입니다. 다음 스크립트는 SQL * Plus를 실행하도록 설계되었습니다. 참고, 나는 의도적으로 현재 스키마 내에서만 작업이 서면으로 작성했습니다.

    그것은 하나의 명령 아니지만, 여기에 내가 그것을 할 방법입니다. 다음 스크립트는 SQL * Plus를 실행하도록 설계되었습니다. 참고, 나는 의도적으로 현재 스키마 내에서만 작업이 서면으로 작성했습니다.

    set heading off
    
    spool drop_constraints.out
    
    select
        'alter table ' || 
        owner || '.' || 
        table_name || 
        ' disable constraint ' || -- or 'drop' if you want to permanently remove
        constraint_name || ';'
    from
        user_constraints;
    
    spool off
    
    set heading on
    
    @drop_constraints.out
    

    당신이 드롭 것을 제한하기 위해 필터는 select 문에 where 절을 추가합니다 -

    현재 스키마보다 더에서 실행하려면 ALL_CONSTRAINTS보다는 user_constraints에서 선택합니다 select 문을 수정합니다.

    주 - 어떤 이유로 내가 이전 단락의 italicization처럼 행동하지 않도록 밑줄을 얻을 수 없습니다. 누군가가 그것을 해결하는 방법을 알고있는 경우,이 대답을 편집 주시기 바랍니다.

  4. ==============================

    4.제약을 가능하게 모든 제약 .. 그리고 ALTER 쿼리를 사용하지 않도록 다음 커서를 사용 ...

    제약을 가능하게 모든 제약 .. 그리고 ALTER 쿼리를 사용하지 않도록 다음 커서를 사용 ...

    DECLARE
    
    cursor r1 is select * from user_constraints;
    cursor r2 is select * from user_tables;
    
    BEGIN
      FOR c1 IN r1
      loop
        for c2 in r2
        loop
           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;
        end loop;
      END LOOP;
    END;
    /
    
  5. ==============================

    5.이 될 수있다하여 스크립트에서 PL / SQL 꽤 간단하게 DBA / ALL / USER_CONSTRAINTS 시스템 뷰를 기반으로하지만, 소리 등 다양한 세부 사소한로하지합니다. 당신은 수행되는 순서에주의해야하고 당신은 또한 고유 인덱스의 존재를 고려해야합니다.

    이 될 수있다하여 스크립트에서 PL / SQL 꽤 간단하게 DBA / ALL / USER_CONSTRAINTS 시스템 뷰를 기반으로하지만, 소리 등 다양한 세부 사소한로하지합니다. 당신은 수행되는 순서에주의해야하고 당신은 또한 고유 인덱스의 존재를 고려해야합니다.

    당신이 당신의 자신에 기본 키를 참조하는 다른 스키마의 테이블에 외래 키를 외래 키에 의해 참조 된 고유 또는 기본 키를 삭제할 수 없습니다, 및이있을 수 있기 때문에 순서는 다음 ALTER에게 ANY TABLE 권한이 있으므로하지 않는 것이 중요합니다 당신 그 PK와과를 UKs을 삭제할 수 없습니다. 당신이 거의 항상 더 나은 비에서 지원하는 "진짜"제약 조건으로 고유 제한 조건을 구현하는 방법이다 이러한 이유 (제약 조건을 삭제하기 위해 드롭 할 수 있도록 또한 당신은 고유하지 않은 인덱스 인에 고유 인덱스를 전환 할 수 없습니다 - 독특한 인덱스).

  6. ==============================

    6.당신은 하나의 명령으로이 작업을 수행 할 수있는 것처럼 보이지 않지만, 여기에 내가 찾을 수 그것에 가장 가까운 것입니다.

    당신은 하나의 명령으로이 작업을 수행 할 수있는 것처럼 보이지 않지만, 여기에 내가 찾을 수 그것에 가장 가까운 것입니다.

  7. ==============================

    7.이 제약 조건을 비활성화하는 또 다른 방법 (이 https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817에서 온)입니다

    이 제약 조건을 비활성화하는 또 다른 방법 (이 https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817에서 온)입니다

    WITH qry0 AS
           (SELECT    'ALTER TABLE '
                   || child_tname
                   || ' DISABLE CONSTRAINT '
                   || child_cons_name
                     disable_fk
                  ,   'ALTER TABLE '
                   || parent_tname
                   || ' DISABLE CONSTRAINT '
                   || parent.parent_cons_name
                     disable_pk
              FROM (SELECT a.table_name child_tname
                          ,a.constraint_name child_cons_name
                          ,b.r_constraint_name parent_cons_name
                          ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) child_columns
                      FROM user_cons_columns a
                          ,user_constraints b
                     WHERE a.constraint_name = b.constraint_name AND b.constraint_type = 'R'
                    GROUP BY a.table_name, a.constraint_name
                            ,b.r_constraint_name) child
                  ,(SELECT a.constraint_name parent_cons_name
                          ,a.table_name parent_tname
                          ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) parent_columns
                      FROM user_cons_columns a
                          ,user_constraints b
                     WHERE a.constraint_name = b.constraint_name AND b.constraint_type IN ('P', 'U')
                    GROUP BY a.table_name, a.constraint_name) parent
             WHERE child.parent_cons_name = parent.parent_cons_name
               AND (parent.parent_tname LIKE 'V2_%' OR child.child_tname LIKE 'V2_%'))
    SELECT DISTINCT disable_pk
      FROM qry0
    UNION
    SELECT DISTINCT disable_fk
      FROM qry0;
    

    매력처럼 작동

  8. ==============================

    8.은 "사용 안 함"스크립트에서 ORDER BY 절은해야합니다 :

    은 "사용 안 함"스크립트에서 ORDER BY 절은해야합니다 :

    ORDER BY c.constraint_type DESC, c.last_change DESC
    

    이 조항의 목적은 올바른 순서에서 해제 제약이다.

  9. ==============================

    9.

    SELECT 'ALTER TABLE '||substr(c.table_name,1,35)|| 
    ' DISABLE CONSTRAINT '||constraint_name||' ;' 
    FROM user_constraints c, user_tables u 
    WHERE c.table_name = u.table_name; 
    

    이 문장은 기본 키, 외래 키, 다른 제약 조건을 포함하여 모든 제약 조건을 해제 명령을 반환합니다.

  10. ==============================

    10.루프 커서 (사용자 = 'TRANEE'표 = 'D')

    루프 커서 (사용자 = 'TRANEE'표 = 'D')

    declare
        constr all_constraints.constraint_name%TYPE;
    begin
        for constr in
            (select constraint_name from all_constraints
            where table_name = 'D'
            and owner = 'TRANEE')
        loop
            execute immediate 'alter table D disable constraint '||constr.constraint_name;
        end loop;
    end;
    /
    

    (당신이 가능하게하지 않도록 변경하는 경우, 당신은 모든 제약 조건을 활성화 할 수 있습니다)

  11. ==============================

    11.다음 쿼리에 의해 반환 된 모든 명령을 실행할 수 있습니다 :

    다음 쿼리에 의해 반환 된 모든 명령을 실행할 수 있습니다 :

    'ALTER TABLE'|| SUBSTR (c.table_name, 1,35)를 선택 || 'DISABLE CONSTRAINT'|| constraint_name을 || ' ; ' user_constraints의 C에서 --where c.table_name = 'TABLE_NAME';

  12. from https://stackoverflow.com/questions/128623/disable-all-table-constraints-in-oracle by cc-by-sa and MIT license