출처 -- http://www.mcpworld.com/eseminar/seminar_list.asp
SQL Server 2000에서의 오류 처리
SQL Server 2000에서는 @@error 함수가 오류 정보를 나타냄
@@ERROR
전역 변수
마지막으로 실행된 T-SQL문의 오류 번호를 반환함
T-SQL 문이 성공적으로 실행된 경우 @@ERROR = 0
T-SQL 문이 실행될 때마다 새로운 값이 설정됨
제약 사항
SQL 문 다음에 매번 @@ERROR 값을 검사해야 함
GOTO 문과 Label을 사용하기 때문에 중앙 집중화된 오류 처리를 구현하게 됨
트랜잭션 또는 일괄 처리(Batch)를 중단시키는 오류의 경우에는 오류 처리가 되지 않음
자세한 오류 정보가 제공되지 않음
SQL Server 2005에서의 오류 처리
SQL 20005에서는 T-SQL로 예외 처리를 하는 기능이 제공됨
오류 포착, 오류 처리, 오류 로깅이 가능함
상세한 오류 정보 액세스가 가능함
TRY…CATCH 구조
구문:
BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
{ sql_statement | statement_block }
END CATCH
[ ; ]
TRY…CATCH
TRY 블록 영역
BEGIN TRY와 END TRY 사이에 있는 코드
CATCH 블록 영역
BEGIN CATCH와 END CATCH 사이에 있는 코드
TRY 블록 영역 내에서 오류가 발생
실행이 관련 CATCH 블록으로 이동함
TRY…CATCH 구조는 중첩 가능함
CATCH 블록 영역 내에서 오류가 발생
중첩 TRY…CATCH 구조의 경우에는 가장 가까운 CATCH 블록으로 이동함
중첩 구조가 아닌 경우에는 호출자에게 오류가 반환됨
TRY…CATCH가 포착 가능한 오류
@@ERROR 값 설정이 발생하는 모든 런타임 오류
오류 정보 함수
오류 정보를 조회하기 위하여 CATCH 블록 영역에서 사용 가능한 함수
error_number() : 오류 번호
error_message() : 오류 메시지
error_severity() : 오류 심각도
error_state() : 오류 상태 번호
error_line() : 오류를 발생시킨 줄 번호
error_prodecure() : 오류가 발생한 저장 프로시저 또는 트리거의 이름
CATCH 블록 영역의 외부에서 실행하면 NULL이 반환됨
TRY…CATCH가 처리할 수 없는 오류
경고 메시지 및 정보 제공 메시지 (심각도 0-10)
데이터베이스 연결을 끊는 오류 (심각도 20-25)
Attentions (클라이언트 인터럽트 요청 또는 손상된 클라이언트 연결)
KILL 문
컴파일 및 SQL 문 차원의 재컴파일 오류
예:
컴파일 오류: Incorrect Syntax
SQL 문 단위 재컴파일 오류 : 개체가 존재하지 않아서 발생하는 오류 (deferred name resolution)
실행문과 동일한 레벨에 있는 CATCH 블록에서는 포착 불가
실행문보다 상위 레벨에 있는 CATCH 블록에서는 포착 가능
커밋 불가 트랜잭션
TRY 블록 내에서의 트랜잭션 중단 오류
커밋 불가 트랜잭션
커밋될 수 없는 모든 활성 트랜잭션
커밋 불가 트랜잭션에서는 오직 읽기 또는 ROLLBACK TRANSACTION만 실행 가능
쓰기 작업 또는 COMMIT TRANSACTION은 실행 불가
트랜잭션 상태 조회 XACT_STATE()
XACT_STATE() 함수
트랜잭션의 상태를 반환함
1 = 활성 상태의 커밋 가능한 트랜잭션
0 = 비활성 트랜잭션
-1 = 활성 상태의 커밋 불가한 트랜잭션
예외 처리 - RAISERROR
RAISERROR : 오류를 발생시키는데 사용됨
RAISERROR는 TRY 또는 CATCH 블록에서 사용함
TRY 블록에서 RAISERROR를 사용
심각도 11-19인 RAISERROR가 실행되면 CATCH 블록으로 이동함
CATCH 블록에서 RAISERROR를 사용
RAISERROR를 사용하여 오류를 호출자에게 반환함
오류 처리 가이드
TRY…CATCH 구조를 사용하여 오류 처리 로직을 구현할 것을 권고함
기존의 @@ERROR 기반의 오류 처리 코드를 TRY…CATCH로 대체할 것을 권고함
오류 정보를 기록할 것을 권고함
문제점을 진단하기 위해서는 오류 정보가 필요함
심각한 오류는 테이블에 기록을 남길 것을 권고함
CATCH 블록 코드를 테스트할 것을 권고함
[출처] SQL Server 2005 TSQL - 5.. 오류처리 |작성자 선경
