2012-02-25 4 views
1

나는 내가 DB를제약을 두 번 검사

. 내가에서 일하고 있어요 DB에 대한 몇 가지 조언이 필요하고, 지금은 프로 시저, 함수 및 트리거 (PL/SQL에서 일하고 있어요). 세 개의 엔티티가 있으며 두 개는 세 번째 엔티티 (개념적 데이터 모델 당)를 상속합니다. 따라서 세 번째 엔티티를 참조하는 두 개의 테이블이 있음을 의미합니다. 부모 테이블과 자식 테이블에 동시에 데이터를 삽입해야하므로 부모 테이블에 삽입 된 프로 시저를 작성하고 이전 프로 시저를 호출 할 수있는 자식 프로 시저에 삽입 한 프로 시저를 작성해야합니다.

내 문제는 부모 테이블에 삽입 한 다음 하위 테이블에 삽입하려고했는데 어떤 이유로 제약 조건을 충족시키지 않는 자식 테이블에 데이터를 삽입하면 어떻게됩니까? 즉, 제약 조건에도 불구하고 여전히은 함수에서 입력 데이터를 확인해야합니까? 당신의 제안은 무엇입니까?

답변

2

에 달려 있습니다.

자식 테이블과 부모 테이블간에 외래 키 제약 조건이 있다고 가정하고 부모 테이블에 존재하지 않는 키를 사용하여 자식 테이블에 행을 삽입하려고하면 INSERT은 제약이 위반되었음을 나타냅니다. 제약 조건 위반 예외로 인해 INSERT 연산이 실패하기를 원한다면 아무 것도 확인하지 않아도됩니다.

반면에 발신자에게 더 나은 예외를 제공하기 위해 유효성을 코드화 할 수 있습니다. 예를 들어, 테이블이 여러 다른 테이블을 참조하는 여러 개의 외래 키를 가질 것이 일반적입니다. 유효하지 않은 매개 변수를 호출자에게보다 구체적으로 알릴 수 있도록 매개 변수가 유효한지 확인하는 것이 좋습니다.

부모 테이블에 삽입하고 하위 테이블에 삽입하는 방법이 모두 성공하는지 또는 둘 다 실패하는지 확인하는 방법을 묻는 경우 적절한 트랜잭션 경계를 설정하는 방법에 대해 설명합니다. 당신은 다음과 같은 것을 할 것입니다.

PL/SQL 응용 프로그램은 항상 명시 적으로 커밋 또는 롤백해야합니다. 그리고 이러한 트랜잭션 제어 문은 가능한 최고 수준이어야합니다. 예를 들어 insert_into_parent 절차에서 트랜잭션 제어 명령문을 사용하고 싶지는 않을 것입니다. 예를 들어 더 광범위한 트랜잭션 범위를 원할 경우이 절차를 사용할 수 없기 때문입니다.

+0

예, 외래 키 제약 조건이 있습니다. 그러나 이는 중요한 것이 아니라 나머지 테이블 제약 조건입니다. 예를 들어,이 테이블을 가지고 특정 CHECK 제약 조건이 있다고 가정 해 봅시다. 두 번째 테이블에 데이터를 삽입 한 경우 (첫 번째 테이블에 데이터를 성공적으로 삽입 한 후) 제약 조건을 위반했기 때문에 어떤 이유로 예외가 발생했습니다. 두 번째 테이블에는 데이터가 기록되지만 첫 번째 테이블에는 데이터가 기록됩니다 . 그것이 저를 걱정하는 것입니다. –

+2

@ user1231958 - 이것이 바로 트랜잭션 경계입니다. 자식 테이블에 대한 삽입이 실패하고 두 삽입 작업이 성공하지 않는 한 부모 테이블에 대한 삽입을 커밋하지 않으려면 하위 테이블에 삽입하는 프로 시저가 커밋을 발행합니다. –

+0

롤백 명령어를 발행해야합니까, 아니면 자동입니까? 프로 시저 내에서 하나의 테이블에 하나의 삽입을 삽입 한 다음 다른 프로 시저에서 호출하면 어떻게됩니까? 프로 시저 A -> 프로 시저 B 호출 -> 프로 시저 B는 프로 시저 A 삽입을 삽입하고 리턴합니다. –

관련 문제