반응형

일반적으로 고객사 인사DB에서 DTS로 긁어와서 우리 쪽의 인사정보 테이블에 동기화시키는 작업을 새벽에 예약 수행하게 된다. 이런 작업은 보통 다음과 같은 두 단계로 이루어진다.

  1. DTS로 고객사 인사DB 내용을 우리쪽에 긁어와서 TEMP TABLE에 저장한다.
  2. TEMP TABLE과 실제 우리측 인사정보 테이블과 비교하여 변경된 사항을 UPDATE 혹은 INSERT한다.



문제는 고객사 DB의 정보가 잘못된 경우이다. 이럴 땐 데이터가 잘못된 한개의 레코드때문에 전체 데이터의 업데이트가 ROLLBACK되어 버린다. 더욱 큰 문제는, 도대체 어느 레코드가 문제인지 찾기가 쉽지 않다는 것이다. 그래서 TEMP TABLE에 긁어온 데이터를 인사정보 TABLE에 반영할 때는 다음과 같이 해야 한다.

  1. DTS로 고객사 인사DB 내용을 우리쪽에 긁어와서 TEMP TABLE에 저장한다.
  2. TEMP TABLE에서 레코드 1개씩 읽어들여서 기존의 인사정보 TABLE과 비교, 없다면 INSERT하고, 변경되었다면 UPDATE, 변경사항 없다면 SKIP한다. 이때 만약 UPDATE 및 INSERT에 오류가 발생한다면 내용을 이벤트로그 등에 기록한다.
  3. 2번을 모든 TEMP TABLE 레코드에 대해 반복하며 수행한다.


실제 SQL 프로시져로 쓰면 다음과 같이 된다.

  1. DECLARE @USER_SABUN VARCHAR(20),   
  2.   @USER_NAME VARCHAR(20),   
  3.   @USER_DEPT_CODE VARCHAR(20),   
  4.   @USER_STATUS INT,   
  5.   @ErrorMsg VARCHAR(200)   
  6. DECLARE Cur CURSOR FOR    
  7.  SELECT USER_SABUN, USER_NAME, USER_DEPT_CODE, USER_STATUS    
  8.  FROM INSA_INFO_TEMP   
  9. OPEN Cur   
  10. FETCH NEXT FROM Cur   
  11. INTO @USER_SABUN, @USER_NAME, @USER_DEPT_CODE, @USER_STATUS   
  12. WHILE (@@FETCH_STATUS = 0)   
  13. BEGIN  
  14.  IF (NOT EXISTS (SELECT * FROM INSA_INFO WHERE USER_SABUN = @USER_SABUN))   
  15.  BEGIN  
  16.   INSERT INTO INSA_INFO (USER_SABUN, USER_NAME, USER_DEPT_CODE, USER_STATUS)   
  17.    VALUES  (@USER_SABUN, @USER_NAME, @USER_DEPT_CODE, @USER_STATUS)   
  18.   IF (@@ERROR > 0)   
  19.   BEGIN  
  20.    SET @ErrorMsg = '[인사정보 INSERT오류] 사번 : ' + @USER_SABUN    
  21.                 + ' 에서 오류 발생. 오류코드 : ' + CONVERT(VARCHAR, @@ERROR)   
  22.    EXEC master..xp_logevent 50001, @ErrorMsg, WARNING     
  23.    CONTINUE  
  24.   END  
  25.  END  
  26.  ELSE  
  27.  BEGIN  
  28.   UPDATE INSA_INFO SET USER_NAME = @USER_NAME,   
  29.      USER_DEPT_CODE = @USER_DEPT_CODE, USER_STATUS = @USER_STATUS   
  30.   WHERE USER_SABUN = @USER_SABUN AND    
  31.    (SER_NAME != @USER_NAME OR  
  32.      USER_DEPT_CODE != @USER_DEPT_CODE OR USER_STATUS != @USER_STATUS)   
  33.   IF (@@ERROR > 0)   
  34.   BEGIN  
  35.    SET @ErrorMsg = '[인사정보 INSERT오류] 사번 : ' + @USER_SABUN    
  36.                 + ' 에서 오류 발생. 오류코드 : ' + CONVERT(VARCHAR, @@ERROR)   
  37.    EXEC master..xp_logevent 50001, @ErrorMsg, WARNING     
  38.    CONTINUE  
  39.   END  
  40.  END  
  41.  FETCH NEXT FROM Cur   
  42.  INTO @USER_SABUN, @USER_NAME, @USER_DEPT_CODE, @USER_STATUS   
  43. END  
  44. CLOSE CUR   
  45. DEALLOCATE CUR  
반응형

+ Recent posts