SQLServer를 사용할 때 GUI툴을 사용하게 될 경우 예기치 않은 처리 속도 지연으로 인하여
서비스 중 문제가 발생하거나 정기점검시간을 초과하게 되는 경우가 가끔 있다.
*다음 글 참조( http://dialup.egloos.com/754263 )
이 문제외에도 아래와 같은 문제가 생길 수가 있다.
*적절한 예를 찾지 못하여 좀 엉성한 예를 드는 것을 이해해 주시기 바랍니다. T.T
아래 구조의 설계는 엉터리 설계입니다. ㅎㅎ~
[상황설정]
------------------------------------------------------------------------------------------
(테이블 관계 및 상태)
1. 상품관리 테이블의 key가 상품판매 내역 테이블에서 참조됨.
2. 상품관리 테이블의 key는 int identity(1,1)형태.
3. 상품관리 테이블의 현재 가장 큰 key는 1343임.
4. 상품관리 테이블 중 1344의 key로 등록된 상품은 등록 후 판매중지로 삭제된 상황.
5. 현재 상품관리 테이블의 identity는 내부적으로 1370까지 증가한 상태.
*identity는 commit이 되지 않더라도 insert문장에 의해서 하나씩 증가하므로...
[그림]테이블 관계 및 data 예

(판매 레포트)
판매레포트는 상품판매 내역 테이블과 상품관리 테이블을 join하여 상품관리 테이블에서 상품명을
가져오며, 상품 테이블에서 삭제된 상품은 "절판된 상품"이라고 출력한다.
------------------------------------------------------------------------------------------
위와 같은 상황에서 상품관리 테이블에 신규 컬럼을 중간에 삽입하는 등의 작업을 GUI툴에서
했다고 가정하면... 아래의 프로세스로 인하여 identity가 재설정된다.
임시 table 생성 >> 기존 data를 임시 table로 복사 >> 기존 table drop >> 임시 table rename
[그림]프로필러에서 잡은 위와 같은 상황의 예

"이 후 새로운 상품을 등록한다면?" 당연히 새로운 상품의 key는 1371이 아닌 1344로 처리가 되며
새롭게 등록된 상품은 이전에 등록되었다 삭제된 상품의 key를 가지면서 문제가 발생하게 된다.
이런 경우가 생기지 않도록 설계하는 것이 중요하겠지만, SQLServer 내부에서 처리되는 방식에
대한 정확한 이해를 가지고 있어야 만에 하나 발생할 수 있는 예기치 않는 문제를 예방할 수 있다.



덧글