5. 자주 하는 실수 (Tip)
실수 1: 끝 날짜를 포함시키고 -1일로 맞춘다
사원 행을 2023-02-28 에서 끝내고 대리 행을 2023-03-01 에 시작하면 조회는 BETWEEN 으로 됩니다. 하지만 변경일마다 -1일 계산이 필요하고, Oracle DATE 처럼 시각이 섞이면 2023-02-28 12:00 의 주문이 어느 행에도 안 걸립니다. 반개구간이면 < 하나로 끝납니다.
실수 2: 현재 행을 UPDATE 로 덮어쓴다
이력이 필요한 컬럼을 UPDATE ... SET dept = ... 로 바꾸면 과거가 사라집니다. 바꿀 때는 예제 5 처럼 기존 행을 닫고 새 행을 넣습니다. 오타를 고치는 것 같은 정정은 예외로 두되, 정정 이력이 필요한지 미리 정합니다.
실수 3: 닫기와 새 행 INSERT 를 따로 커밋한다
두 문장 사이에 실패하면 현재 행이 없는 사원이 생깁니다. 반대로 순서를 바꿔 INSERT 를 먼저 하면 잠깐 현재 행이 둘입니다. 하나의 트랜잭션으로 묶고, 끝난 뒤 영향받은 행 수를 확인합니다.
실수 4: 겹침을 막을 제약이 있다고 믿는다
이 네 DB 에는 기간 겹침을 막는 선언적 제약이 없습니다. 기본 키는 시작일이 같은 행만 막습니다. 저장 전 겹침 검사와 트리거, 그리고 주기적인 오염 검사 쿼리로 지킵니다.
실수 5: 시스템 버전 테이블로 업무 이력을 대신한다
MSSQL 의 시스템 버전 테이블과 Oracle Flashback 은 DB 가 행을 바꾼 시각을 기록합니다. "다음 달 1일부터 승진" 같은 예약 변경이나 지난 날짜로 소급하는 변경은 표현하지 못합니다. Flashback 은 언두 보존 기간이 지나면 조회할 수 없습니다. 업무 유효 기간은 직접 만든 컬럼으로 둡니다.