나의 Winding Road

SQL Server SP Transaction 쿼리 본문

개발/Database

SQL Server SP Transaction 쿼리

WindingRoad 2018. 8. 15. 14:16

[2018-08-15 수요일]

* 내용: SQL Server SP Transaction 쿼리 예시

1. 자료 확인 및 쿼리 작성

1) 참고 자료

2) 작성 쿼리

    2. 확인



      1. 자료 확인 및 쿼리 작성



      1) 참고 자료


      * URL : https://code.i-harness.com/ko/q/9436c6


      2) 작성 쿼리

      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
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      USE [XXXXX]
      GO
      /****** Object:  StoredProcedure [dbo].[XXXXX]    Script Date: 2018-03-13 오후 4:18:15 ******/
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      -- =========================================================================================================================================================
      -- Author:      XXXXX
      -- Create date: 2018.02.06
      -- Update date: 2018.02.06
      -- Update Log:    
      --              1. [2017.02.21] 최초 생성
      --              2. [2017.03.09] 라인 수 검증 로직, 계정코드 값 검증(값이 할당 X) 로직 삽입
      -- Description: 전표 생성 및 예산 차감 TRANSACTION
      -- Execution:    
      --              exec XXXXX @YYYY=2017,@MM=10,@DeptID=N'XXXXX',@FUser=16082,@XBLNR=147221,@gubun='XXXXX',@LINE_CNT=3
      -- =========================================================================================================================================================
      ALTER PROCEDURE [dbo].[XXXXX]
      (
          @YYYY        smallint        -- 회계년
          , @MM        smallint        -- 회계월
          , @DeptID    nvarchar(24)    -- 부서코드
          , @FUser    int              -- 등록자
          , @XBLNR    int              -- 가전표번호
          , @gubun    varchar(100)
          , @LINE_CNT INT              -- TSLIP_D 라인 수
      )
       
      AS
       
      BEGIN
       
          DECLARE @ERR_MSG NVARCHAR(500)
          SET @ERR_MSG = ''
          /* A. 라인 수 검증 로직 */
          IF (
              @LINE_CNT <> (
                  SELECT COUNT(BUZEI)
                  FROM SLIP_D_TRAN
                  WHERE XBLNR = @XBLNR
              )
          )
          BEGIN
              SET @ERR_MSG = ''
              SET @ERR_MSG += '가전표 생성 중 오류(가전표 라인 수)가 발생하였습니다. 오류가 계속 발생할 시 시스템 관리자에게 문의해주세요.'
       
              RAISERROR(@ERR_MSG, 161-- C# 프로그램 try-catch 로직에서 catch문으로 이동하여 정의된 Rollback 로직 수행
          END
       
          /* B. 계정코드 검증 로직 */
          (중략....)
       
          BEGIN TRY
       
              /* TRANSACTION 시작 */
              DECLARE @START_TRAN_CNT INT
              SET @START_TRAN_CNT = @@TRANCOUNT
       
              /* TRANSACTION 시작 */
              IF @START_TRAN_CNT > 0 -- 기존에 실행되던 TRANSACTION이 있는 경우 중단점 설정
              BEGIN
                  SAVE TRANSACTION SAVE_TRAN
              END
              ELSE -- 기존에 실행되던 TRANSACTION이 없는 경우
              BEGIN
                  BEGIN TRANSACTION 
              END
       
              /* 1. 전표 헤더 삽입 */
              INSERT INTO SLIP_H (
                  BUKRS
                  , BUDAT
                  , BLDAT
                  , BLART
                  , XBLNR
                  , BKTXT
                  , WAERS
                  , KURSF
                  , FUser
                  , SLPGB
                  , DeptId
                  , BG_SEQ
                  , VNDOR
                  , OefYN
              )
              SELECT BUKRS
                  , BUDAT
                  , BLDAT
                  , BLART
                  , XBLNR
                  , BKTXT
                  , WAERS
                  , KURSF
                  , FUser
                  , SLPGB
                  , DeptId
                  , BG_SEQ
                  , VNDOR
                  , OefYN
              FROM SLIP_H_TRAN WITH(NOLOCK)
              WHERE XBLNR = @XBLNR
       
              (중략....)
               
              /* 7. TEMP DB DROP */
              DROP TABLE #TMP_SLIP_D_3
              DROP TABLE #TMP_SLIP_D_1
       
              /* COMMIT */
              IF @START_TRAN_CNT = 0 -- 기존에 실행되던 TRANSACTION이 없는 경우
              BEGIN
                  COMMIT TRANSACTION
              END
       
          END TRY
          BEGIN CATCH
              IF @START_TRAN_CNT = 0  -- 기존에 실행되던 TRANSACTION이 없는 경우
              BEGIN
                  ROLLBACK TRANSACTION
              END
              ELSE  
                IF XACT_STATE() <> -1  -- 기존에 실행되던 TRANSACTION이 없는 경우
              BEGIN
                  ROLLBACK TRANSACTION SAVE_TRAN
              END
       
              IF (@ERR_MSG <> ''-- 로직 오류
              BEGIN          
                  RAISERROR(@ERR_MSG, 161)
              END
              ELSE -- SQL 오류
              BEGIN
                  DECLARE @ErrorMessage NVARCHAR(4000)  
                  DECLARE @ErrorSeverity INT  
                  DECLARE @ErrorState INT  
                  SELECT @ErrorMessage = ERROR_MESSAGE()  
                  SELECT @ErrorSeverity = ERROR_SEVERITY()  
                  SELECT @ErrorState = ERROR_STATE()  
       
                  RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
       
                  INSERT INTO SQL_ERROR_LOG
                  SELECT 
                      ERROR_NUMBER()            
                      , ERROR_SEVERITY()        
                      , ERROR_STATE()            
                      , ERROR_PROCEDURE()        
                      , ERROR_LINE()            
                      , ERROR_MESSAGE()        
                      , GETDATE()        
              END    
          END CATCH
       
      END
       
      cs

       

      2. 확인



      * Rolback Commit 여부 확인 

      - select 1 / 0 과 같은 에러 발생 시 정상 Rollback 실행 여부 확인

      Comments