[Sql] Oracle에서 모든 테이블 제약 조건 해제



Answers

제약 사이의 의존성을 계산하려면 다음을 수행하십시오.

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

단일 명령으로 Oracle에서 모든 테이블 제한을 비활성화하려면 어떻게합니까? 이는 단일 테이블, 테이블 목록 또는 모든 테이블에 대한 것일 수 있습니다.




모든 제약 조건을 비활성화하려면 다음과 같은 커서를 사용하십시오 .. 그리고 가능한 제약 조건에 대한 쿼리를 변경 ...

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



그것은 당신이 하나의 명령으로 이것을 할 수있는 것처럼 보이지 않지만, here' 에 내가 찾을 수있는 가장 가까운 것이 있습니다.




"disable"스크립트에서 order by 절은 다음과 같아야합니다.

ORDER BY c.constraint_type DESC, c.last_change DESC

이 절의 목적은 올바른 순서로 제약 조건을 해제하는 것입니다.




Links