부모 레코드 하나와 4 개 이상의 자식 레코드를 계층 적 순서로 삽입해야하는 C# 응용 프로그램이 있습니다. IOW, 부모 계약은 하나 이상의 위치에 적용되며 각 위치에는 하나 이상의 항목이 있으며 각 항목에는 하나 이상의 서비스가 있으며 각 서비스에는 하나 이상의 요구 사항이 있습니다. 응용 프로그램은 먼저 각 레코드의 각 테이블 시퀀스에서 하나씩 오라클 시퀀스 번호 집합을 가져옵니다. 어떤 이유로 든 (레거시 데이터베이스) 각 레코드에는 상위 레코드의 시퀀스 번호뿐만 아니라 계약 시퀀스 번호가 있습니다.트랜잭션에 부모/자식 레코드 삽입
따라서 코드는 트랜잭션을 시작하고 부모 수준의 시퀀스 번호가있는 부모를 삽입 한 다음 부모 레코드를 FK로 이미 채운 위치 레코드와 자체 테이블 시퀀스 번호를 삽입하려고 시도합니다. 그러나 부모 번호를 찾을 수 없기 때문에 FK 위반이라는 Oracle-02291 오류가 발생합니다. 나는이 추측하고
INSERT into Contracts (contract_sequence_number, ...) values (10437, ...);
INSERT into Locations (location_sequence_number, contract_sequence_number, ...)
values (23733, 10437, ...);
...
는 부모가 최선을 다하고되지 않았기 때문에, 따라서 사용할 수 없습니다. 그러나 부모를 커밋 할 수 없습니다. 자식 레코드 중이 실패하면 자식 삽입 전에 커밋이 종료됩니다.
나는 이것이 일반적인 시나리오라는 것을 안다. 답은 반드시 pre-noob이어야한다. 하지만, 지금까지 발견 한 모든 대답은 부모 시퀀스 번호가 FK를 만족시키기 위해 "테이블에서"발견된다는 것을 의미합니다.
이 문제를 해결하는 방법에 대한 의견을 보내 주시면 대단히 감사하겠습니다.
랜디
삽입을 두 개의 분리 된 기능으로 나눌 수 없습니까? 부모 레코드의 ID를 C# 코드로 반환 한 다음이를 사용하여 자식 삽입을 수행 하시겠습니까? – TheGeekYouNeed
실제로 이들은 동일한 트랜잭션 블록 내에서 두 개의 서로 다른 기능을 수행합니다. 내 문제를 명확히하기 위해 두 SQL 문을 보여주고있다. – EoRaptor013