출처 : http://kuaaan.tistory.com/47




일반적으로 고객사 인사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  


'MSSQL*' 카테고리의 다른 글

MSSQL 시스템 명령어  (0) 2013.11.12
암호화 / 복호화  (0) 2013.11.12
SQL 함수  (0) 2009.08.19
SELECT 시에 임의의 변수를 함께 불러올 때 type설정  (0) 2008.12.08
트랜잭션과 잠금  (0) 2008.11.30
Posted by 회사원Z
:

카테고리

More More* (98)
iPHONE* (7)
Power Builder* (31)
HTML5* (2)
CSS3* (1)
jQuery & JavaScript* (17)
ASP* (20)
MSSQL* (10)
ETC* (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

글 보관함