programing

Oracle에서 Check 문에 하위 조회 사용

elecom 2023. 6. 17. 08:16
반응형

Oracle에서 Check 문에 하위 조회 사용

그래서 이 문제를 해결하려고 했지만 마지막 줄(체크)에서는 하위 쿼리를 허용하지 않는 것 같습니다.이 일을 오라클로 만들 방법이 있습니까?

CREATE TABLE Tank (
    n_id            int,
    day             date,
    level           int,
    CONSTRAINT pk_w_td PRIMARY KEY (n_id,day),
    CONSTRAINT fk_w_td_tan FOREIGN KEY (n_id) REFERENCES Tanks ON DELETE CASCADE,
    CHECK (level > 0 AND level <= (SELECT capacity FROM Tanks WHERE Tanks.n_id = TanksDay.n_id))
);

다음은 오류 정보입니다.

Error at Command Line:7 Column:32 Error report: SQL Error: ORA-02251: subquery not allowed here
02251. 00000 -  "subquery not allowed here"
*Cause:    Subquery is not allowed here in the statement.
*Action:   Remove the subquery from the statement.

CHECK 제약 조건은 쿼리를 기반으로 할 수 없기 때문에 이러한 문제를 해결하는 세 가지 기본 방법이 있습니다.

옵션 1: 트리거

가장 간단한 방법은 탱크를 쿼리하고 레벨이 용량을 초과할 경우 예외를 던지는 TANK에 트리거하는 것입니다.그러나 이러한 종류의 단순한 접근 방식의 문제는 동시성 문제를 올바르게 처리하는 것이 거의 불가능하다는 것입니다.세션 1이 용량을 감소시킨 후 세션 2가 레벨을 증가시킨 후 두 트랜잭션이 모두 커밋되면 트리거가 위반을 감지할 수 없습니다.두 테이블 중 하나 또는 둘 다 거의 수정되지 않은 경우에는 문제가 되지 않을 수 있지만 일반적으로 문제가 될 수 있습니다.

옵션 2: 구체화된 보기

TANK와 TANCS 테이블을 결합하는 ON COMMIT 구체화 뷰를 생성한 다음, 구체화 뷰에 Level <= Capacity를 확인하는 CHECK 제약 조건을 생성하여 동시성 문제를 해결할 수 있습니다.구체화된 보기에 제약 조건을 위반하는 데이터만 포함되도록 하여 데이터를 두 번 저장하지 않도록 할 수도 마찬가지입니다.이를 위해서는 두 기본 테이블 모두에 구체화된 보기 로그가 필요하므로 삽입에 약간의 오버헤드가 추가됩니다(트리거를 사용하는 것보다 적음).확인을 커밋 시간으로 푸시하면 동시성 문제가 해결되지만 구체화된 보기 새로 고침이 실패하여 COMMIT 작업이 실패할 수 있으므로 약간의 예외 관리 문제가 발생합니다.응용프로그램은 해당 문제를 처리하고 사용자에게 이 사실을 알려야 합니다.

옵션 3: 데이터 모델 변경

테이블 A에 테이블 B의 한계에 의존하는 값이 있는 경우, 이는 B의 한계가 테이블 B의 속성이 아니라 테이블 A의 속성이어야 함을 나타낼 수 있습니다.물론 데이터 모델의 세부 사항에 따라 다르지만, 고려할 가치가 있는 경우가 많습니다.

유감스럽게도 CHECK 제약 조건은 하위 쿼리를 포함할 수 없습니다. 설명서를 참조하십시오.

찾고 있는 기능은 SQL Assertion이라고 하며 Oracle 12c에서는 아직 구현되지 않았습니다.

저스틴의 대답은 좋은 생각들을 가지고 있습니다.또 다른 방법은 테이블에 대한 모든 삽입/업데이트를 패키지(TAPI)로 래핑하고 검사를 구현하는 것입니다.모든 응용 프로그램이 TAPI를 사용하는지 확인해야 합니다.동시 작업의 영향으로부터 제약 조건을 보호하기 위해 일부 사용자 지정 잠금을 구현해야 합니다.

하고 트거를생사합니다야해를 해야 할 입니다.RAISE_APPLICATION_ERROR허용 범위를 벗어나는 경우.

언급URL : https://stackoverflow.com/questions/4071024/using-subquery-in-a-check-statement-in-oracle

반응형