Oracle.DataAccess.Client를 사용할 때, 인서트가 마지막 하나의 행만 처리되는 문제가 발생하였습니다.
도대체 무엇이 문제인지, 하나하나 다시 살펴보았는데요, 특징이 항상 가장 마지막 로우만 인서트 된다는 것에 주목을 해보았더니 의외로 황당한 곳에 답이 있었어요.
내부적으로 삭제 구문이 반복 실행되면서 발생하는 경우였답니다. 최초의 의도는 '1회 전체 삭제, 그리고 반복하여 모든 로우를 읽어서 인서트 하는 것'이었는데, 반복문에서 '전체 삭제 후 로우 인서트'가 반복된 것이었지요.
따라서 이런 상황이 발생하였다면, 삭제 구문을 포함한 부분을 주의 깊게 살펴보면 답이 빨리 나올 거예요.
일반적으로 이런 문제는 트랜잭션 처리, 데이터베이스 커밋, 혹은 프로시저 안에서 삭제 후 인서트 작업을 반복하는 로직이 원인일 수 있습니다.
삭제 구문 확인: 코드를 통해 DELETE 문이 인서트 작업 전에 실행되고 있는지 확인합니다. 불필요한 DELETE가 반복되면서 마지막 행만 남게 되는 경우가 많습니다.
트랜잭션 관리: 트랜잭션이 제대로 처리되지 않으면, INSERT 작업 후 DELETE가 실행된 후에 마지막 행만 남게 될 수 있습니다. Commit 처리가 적절하게 이루어졌는지도 점검해야 합니다.
저장 프로시저 확인: 데이터베이스 프로시저나 트리거에서 삭제 후 인서트를 반복하는 로직이 있는지 확인해 보세요. 특히 테이블 레벨에서 자동으로 트리거가 실행되는 경우도 있으니 확인이 필요합니다.
로깅 추가: 문제 해결을 위해 트랜잭션 단계마다 로그를 추가해, DELETE와 INSERT가 어느 단계에서 발생하는지 정확히 파악할 수 있습니다.
위 사항을 하나씩 점검해보시면, 문제가 되는 삭제 구문이나 트랜잭션 처리 오류를 찾아 해결할 수 있을 것입니다. 마지막 행만 남는다면 거의 항상 내부에 잘못된 삭제 구문이 포함되어 있는 경우가 많으니, 그 부분을 먼저 확인해 보세요~
