Intro
안녕하세요
초보 DBA 다뉴입니다.
저번포스팅 Exception / Try ~ Catch문 기초에 이어서 활용하는 방법에 대해서 한번 알아보려고 하는데요.
기초에 대해 정리한 글이 궁금하신분은 아래의 글을 참조바랍니다!
Transaction 제어
Begin Tran을 사용한 Commit / Rollback
begin try
begin tran
/*실행할 Transaction*/
-- 오류가 없다면 commit
commit tran
end try
begin catch
-- 오류 발생시 rollback
rollback tran
end catch
- Try 블록에 오류가 없을 경우 commit tran 까지 동작 후 catch를 건너뛴다.
- Try 블록에 오류가 있을 경우 catch블록으로 이동 하여 rollback tran이 실행된다.
예제
create table #TB_Tran_Test(
seq int, -- 실행 순서
txt varchar(100) -- 실행 내용
)
begin try
begin tran
insert #TB_Tran_Test values(1, '정상 실행')
commit tran
begin tran
insert #TB_Tran_Test values(1, 2/0) -- 에러
commit tran
end try
begin catch
rollback tran
end catch
select * from #TB_Tran_Test
- 여러 Commit을 통해 일정부분까지 반영 하도록 할 수 있다.
- 에러가 나기전 Commit까지 Commit이 완료되며, 에러 난 후로는 롤백이 된다.
Throw - 예외 발생시키기
Throw란?
- Throw는 쿼리문에서 사용자가 직접 예외를 발생시킬 수 있게 해줍니다.
throw error_number, message, state;
- error_number
- 예외를 나타는 상수 or 변수이다.
- int형 이며 50000 이상 2147483647이하의 수여야 한다.
- message
- 예외를 설명하는 문자열 or 변수이다.
- nvarchar형 이며 길이는 2048이다.
- state
- 메시지와 연결할 상태를 나타내는 상수 or 변수이다.
- tinyint형 이며 0~255사이 이다.
- Throw문 앞의 문은 세미콜론(;)으로 끝나야한다.
- Try~Catch 문을 사용할 수 없으면 명령문 일괄 처리가 종료되며, 예외가 발생한 줄 번호와 프로시저가 설정됩니다.
- 심각도는 16으로 설정됩니다.
- 매개 변수 없이 지정된 Throw문은 Catch블록 안에 있어야 한다. 이 경우 예외가 발생한다.
- message의 텍스트에 %는 예약문자로 사용하기위해서는 %%로 사용해야한다.
예외 발생 예제
Throw 사용 - 기본
THROW 50001, 'Test Error', 1;
Try 구문에서 Thow사용
DECLARE @height int
set @height = 250
begin try
if @height >= 230
begin;
throw 50001, '키에 230 이상을 입력 할 수 없습니다', 1
end
end try
begin catch
print @height
print ERROR_NUMBER()
print ERROR_SEVERITY()
print ERROR_STATE()
print ERROR_MESSAGE()
end catch
- Try문에서 발생한 예외는 심각도 16으로 Catch문으로 이동한다.
Catch 구문에서 Throw사용
set @height = 250
begin try
if @height >= 230
begin;
throw 50001, '키에 230 이상을 입력 할 수 없습니다', 1;
end
end try
begin catch
print @height;
throw;
print ERROR_NUMBER()
print ERROR_SEVERITY()
print ERROR_STATE()
print ERROR_MESSAGE()
end catch
- Catch문에서 매개변수 없는 throw는 try문의 오류를 출력한다.
Outro
Exception 을 활용한 Transaction 제어와 Throw를 활용한 오류 메시지 활용에 대해 알아봤는데요.
이 외에도 심각도, RAISERROR, FORMATMESSAGE 등의 소소하게나마 더 알아두면 좋은 항목들이 있습니다.
이 부분에 대해서는 기회가있다면 추후 자세히 다루도록 하겠습니다.
감사합니다.
반응형
'DATABASE > MsSQL' 카테고리의 다른 글
[MsSQL] 자주 쓰는 쿼리 - Data File Size, Data File 경로 확인 (MDF, NDF) (1) | 2023.09.02 |
---|---|
[MsSQL] Exception / Throw 사용 시 주의 사항 - rollback (1) | 2023.08.05 |
[MsSQL][SSIS] SSIS 설치 방법 - Visual Studio 2012 Shell (1) | 2023.08.02 |
[MsSQL] Table / Column Comment - 코멘트, 설명 달기 (1) | 2023.08.01 |
[MsSQL] Database File 디스크 이동 DBA 실무 - detach / attach (1) | 2023.07.27 |
[DBA][MsSQL] 자주 쓰는 쿼리 - Table Description / 테이블 정보 (3) | 2023.07.25 |
[DBA][MsSQL] 자주 쓰는 쿼리 - Agent 조회 쿼리 (4) | 2023.07.24 |
[MsSQL] Exception / Try ~ Catch 문 기초 (2) | 2023.07.18 |