2017-02-11 2 views
0

요구 사항에 따라 우리는 고유 한 상황에 직면 해 있습니다. 우리는 특정 제출자 ID에 대해서만 테이블에 가상 기본 키를 만들고 싶습니다. 주 : 제출자 ID는 테이블의 컬럼 중 하나입니다.Oracle PLSQL 트리거의 논리처럼 기본 키를 생성하는 동안 컴파일

우리는이 목표를 달성하기 위해 트리거를 사용하기로 결정했으나 삽입을 위해 잘 동작하지만 업데이트를 확인할 때 다음과 같은 오류가 발생합니다 : [ORA-04091 : 테이블 XYZ가 변경 중이며 트리거/기능에서 볼 수 없습니다]

워크 플로우 이해하기위한 샘플 예 : (시퀀스, Submitter_id, 국가, 설명)

고유 기본 키

테이블 구조 : 순서

Submitte하는 경우 r_id = 'SYSTEM'그러면 국가에 가상 기본 키가 필요합니다. 업데이트하는 동안 오류를주고있다 테이블 XYZ에 BEFORE INSERT OR UPDATE 트리거에 대한

현재 코드 : 사전에

If (:NEW.Submitter_Id = 'SYSTEM') Then 
    BEGIN 
     SELECT count(1) INTO counterVariable 
     FROM XYZ 
     WHERE Country = :NEW.Country 
     And Submitter_Id = 'SYSTEM'; 
    EXCEPTION 
     WHEN OTHERS THEN 
     raise_application_error(-20005, 'Sample Error'); 
    END; 

    If (counterVariable != 0) 
    Then 
     raise_application_error(-20005, 'Primary Key Violation error'); 
    End If; 

End If; 

감사합니다.

+0

http://stackoverflow.com/questions/17609844/how-to-make-a-trigger-like-primary-key-constraint 비슷한 질문이 있지만 구체적인 해결책없이. 기본 키 제약 조건 또는 고유 인덱스를 포함하지 않는 문제를 해결하는 방법을 찾고 있습니다. – pOrinG

답변

1

방아쇠를 당길 필요가 없습니다. 나는 기능적 고유 색인을 만들뿐입니다.

create unique index xyz_unq on xyz(decode(submitter_id, 'SYSTEM', country)); 
+0

응답 해 주셔서 감사합니다. 그러나 실제 시나리오에서는 1 (국가) 대신 4 개의 열이 있다는 것이 좋습니다. – pOrinG

+0

나는 여전히 인덱스로 할 수 있다고 생각한다. DECODE 대신 CASE 문을 사용하십시오. –

+0

오, 당신이 말했습니다, "나라 대신 ..."그렇다면 더 간단합니다. 4 개의 DECODE를 사용하여 4 개의 열에 기능적 색인을 생성하십시오. –

관련 문제