[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에서 모든 테이블 제한을 비활성화하려면 어떻게합니까? 이는 단일 테이블, 테이블 목록 또는 모든 테이블에 대한 것일 수 있습니다.




이것은 DBA / ALL / USER_CONSTRAINTS 시스템 뷰를 기반으로하는 PL / SQL에서 매우 간단하게 스크립팅 할 수 있지만 다양한 세부 사항은 사소한 것이 아닙니다. 그것이 수행되는 순서에 대해 신중해야하며 고유 인덱스의 존재를 고려해야합니다.

외래 키에 의해 참조되는 고유 키 또는 기본 키를 삭제할 수 없기 때문에 순서가 중요합니다. 또한 자체 스키마에서 기본 키를 참조하는 다른 스키마의 외래 키가있을 수 있으므로 ALTER ANY TABLE 권한이 없으면 그 PKs와 영국을 떨어 뜨릴 수는 없다. 또한 고유 색인을 고유하지 않은 색인으로 전환 할 수 없으므로 제약 조건을 삭제하기 위해 색인을 삭제해야합니다 (이러한 이유 때문에 고유 제약을 비 제약 색인에서 지원하는 "실제"제약으로 구현하는 것이 거의 항상 좋습니다). 고유 색인).




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




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

ORDER BY c.constraint_type DESC, c.last_change DESC

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