반응형
  1. /**********************************************************************************************
    -- Title : [2k] Batch와 구문 오류, 컴파일 오류와 런타임 오류 비교
    -- Reference : 우철웅님 세미나 자료
    -- Key word : batch, error, compile, runtime, 컴파일, 런타임, 배치, 구문
    **********************************************************************************************/
    USE TempDB

    IF OBJECT_ID('TEST') IS NOT NULL
     DROP TABLE Test

    CREATE TABLE Test (id int PRIMARY KEY)
    GO

    -- 1. 구문 오류, 컴파일 오류로 전체가 수행 되지 못함
    INSERT Test VALUES(1)
    INSERG Test VALUES(2) -- 구문오류
    INSERT Test VALUES(3)
    GO

    select * from test

    -- 2. 런타임 오류,  개체 오류의 경우는 오류 이후 일괄 처리를 즉시 중지'
    INSERT Test VALUES(4)
    INSERT Tess VALUES(5) -- 개체 오류
    INSERT Test VALUES(6)
    GO

    select * from test
    -- 3. 런타임 오류,  제약 조건 오류의 경우는 오류 구문만 제외하고 계속해서 수행'
    INSERT Test VALUES(7)
    INSERT Test VALUES(7) --PRIMAY KEY  제약 오류
    INSERT Test VALUES(8)
    GO

    select * from test
    GO

    -- 4. Transaction과 런타임오류와의 관계
    truncate table test

    /* Case 1 */
    BEGIN TRAN
     INSERT Test VALUES(9)
     INSERT Test VALUES(9) --PRIMAY KEY  제약 오류
     INSERT Test VALUES(10)
    COMMIT TRAN

    SELECT * FROM Test

    /* Case 2 */
    BEGIN TRAN
     INSERT Test VALUES(11)
     IF @@ERROR <> 0  GOTO ErrTrap
     
     
     INSERT Test VALUES(11) --PRIMAY KEY  제약 오류
     IF @@ERROR <> 0  GOTO ErrTrap

     INSERT Test VALUES(12)
     IF @@ERROR <> 0  GOTO ErrTrap

    ErrTrap:
     BEGIN  
      ROLLBACK TRAN  
      RETURN
     END
    COMMIT TRAN
    GO

    SELECT * FROM Test
    GO

    -- SQL Server 2005에서는 Error Trap을 걸 수 있으므로 이렇게 코딩할 필요는 없음
    BEGIN TRY
     { sql_statement | statement_block }
    END TRY
    BEGIN CATCH TRAN_ABORT
     { sql_statement | statement_block }
    END CATCH

    -- 5. XACT_ABORT 세션 옵션은 기본적으로 OFF 이다.
    SET XACT_ABORT ON
    BEGIN TRAN
     INSERT Test VALUES(11)
     INSERT Test VALUES(11) --PRIMAY KEY  제약 오류
     INSERT Test VALUES(12)
    COMMIT TRAN

    SELECT * FROM Test
    GO

    /********************************************************************************
    Description : Server 레벨에서 user options로 XACT_ABORT 강화하기 위해서
         Programming시 주의점은 @@Error 값을 확인하여 처리하는 로직에서도
         런타임 오류가 발생하면 즉시 RollBack하고 반환하게 되므로
                           이런 문제를 해결하기 위해서는 해당 저장 프로시저나 세션에서
         SET XACT_ABORT OFF로 설정하는 작업을 해 주어야 함
    Writer :  woo choul_woong
    Date    :  2004.10.13
    *********************************************************************************/

    -- 6. Server 레벨에서 user options로 XACT_ABORT 강화하기 위해서

    --USE master
    --EXEC sp_configure 'show advanced option', '1'
    SET XACT_ABORT OFF
    SELECT @@OPTIONS

    EXEC sp_configure 'user options',5496
    GO
    RECONFIGURE WITH OVERRIDE
    GO

    SELECT @@OPTIONS

반응형

+ Recent posts