반응형
- /**********************************************************************************************
-- 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
반응형