INFO: Transact-SQL에서의 오류 처리

기술 자료 번역 기술 자료 번역
기술 자료: 44519 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR44519
모두 확대 | 모두 축소

이 페이지에서

요약

본 문서는 Transact-SQL 일괄 처리와 저장 프로시저(Stored Procedure)에서의 서로 다른 오류 처리 방법을 다룹니다. 중첩된 트랜잭션과 프로시저에서의 오류 처리에 관한 추가 요소 뿐만 아니라 오류의 세 가지 클래스를 설명합니다.

추가 정보

구문 오류

SQL 일괄 처리 또는 프로시저에서의 구문 오류는 실행이 시작되기 전에 찾아낼 수 있으므로 하나의 구문 오류가 발생하면 전체 일괄 처리 또는 프로시저가 거부됩니다. 실행이 시작되지 않았으므로 이 경우에는 트랜잭션의 구성 요소가 무엇인지 그리고 어떤 것이 취소되었는 지는 중요하지 않습니다. 구문 오류가 있는 일괄 처리는 하나 또는 그 이상의 오류 메시지를 나타내어 각 메시지에 대해 한 번씩 사용자 정의 MESSAGE 핸들러가 호출됩니다. 잘못된 일괄 처리를 보낸 dbsqlexec는 FAIL 상태를 반환하며 일괄 처리의 결과를 받기 위한 dbresult는 NO_MORE_RESULTS 상태를 반환합니다. 사용자 정의 오류 핸들러는 내부 DB-Library(DB-Lib) 오류를 리포트하는 데 사용됩니다.

Microsoft SQL Server 버전 7.0을 시작할 때 DB-Lib가 여전히 지원되더라도 SQL Server에 액세스하기 위해 만들어진 모든 새로운 Visual Basic 응용 프로그램은 ActiveX Data Objects(ADO) 및 Remote Data Objects(RDO)와 같은 Visual Basic 데이터 API를 사용해야 합니다.

실행 시간 오류(Execution-Time Errors)

실행 시간 오류는 치명적일 수도 있고 그렇지 않을 수도 있습니다. 존재하지 않는 테이블이나 열을 사용하려는 시도는 치명적입니다. 사용 권한 위반과 고유한 인덱스에 중복되는 값을 삽입하려는 시도는 치명적이지 않습니다. 테이블을 참조하는 프로시저를 작성한 다음 그 테이블을 삭제해야만 존재하지 않는 테이블을 사용하려는 시도가 구문 확인을 통과할 수 있습니다.

두 경우 모두 각 메시지에 한 번씩 사용자 정의 MESSAGE 핸들러가 호출됩니다. Severity가 16 이상인 메시지는 치명적입니다.

오류가 치명적이면 커밋되지 않은 업데이트는 취소됩니다. BEGIN/COMMIT으로 묶여지지 않은 문장은 성공적일 때 각각 개별적으로 커밋되기 때문에 취소되지 않습니다. 현재 프로시저는 BEGIN/COMMIT으로 묶여야만 실행이 종료됩니다.

오류가 치명적이 아니라면 직접 ROLLBACK을 수행해야만 커밋되지 않은 업데이트가 취소됩니다. 일괄 처리 또는 프로시저가 BEGIN/COMMIT으로 묶이거나 RETURN을 실행해야만 실행은 종료됩니다.

일괄 처리를 보낸 dbsqlexec는 오류가 치명적일 때 FAIL을, 치명적이지 않을 때 SUCCEED를 반환합니다. dbresults는 오류가 치명적일 때 NO_MORE_RESULTS을, 치명적이지 않을 때 FAIL을 반환합니다.

응용 프로그램 레벨에서의 오류

SQL Server는 "0 rows affected"와 같은 오류의 심각성을 알 수 없기 때문에 이러한 예외를 오류로 간주하지 않습니다. 응용 프로그램은 이러한 각각의 조건을 직접 테스트해야 합니다. 프로시저를 종료하려면 RETURN 문을 사용해야 합니다. 그렇지 않으면 ROLLBACK이 실행된다 하더라도 프로시저 또는 일괄 처리의 나머지 문장이 실행됩니다.

이러한 예외는 RAISERROR가 실행되어야만 사용자 정의 메시지 핸들러에 메시지를 나타냅니다. dbsqlexec는 SUCCEED를 반환합니다. dbresults는 RAISERROR가 실행되지 않으면 SUCCEED를, RAISERROR가 실행되면 FAIL을 반환합니다.

ROLLABACK

ROLLBACK은 일괄 처리 또는 프로시저를 종료하지 않고 커밋되지 않은 업데이트를 취소합니다. 일괄 처리 또는 프로시저 내의 그 다음 문장은 정상적으로 실행됩니다. 이렇게 하여 오류가 발생하면 응용 프로그램은 복잡한 부수 동작을 수행할 수 있습니다.

중첩된 작업 논리 단위(LUW)

BEGIN/COMMIT으로 묶인 문장은 BEGIN/COMMIT으로 묶인 다른 그룹의 문장에 중첩될 수 있습니다. 내부 또는 외부 작업 논리 단위(LUW) 내에 치명적 오류가 발생하면 실행은 종료되고 모든 업데이트는 취소됩니다. 내부 또는 외부 작업 논리 단위(LUW)에 치명적이지 않은 오류가 발생하면 실행은 계속되고 아무것도 취소되지 않습니다.

중첩된 작업의 논리 단위는 중첩된 저장 프로시저(Stored Procedure)의 컨텍스트에서만 의미가 있습니다. 작업의 논리 단위를 중첩하는 기능을 사용하면 COMMIT/ROLLBACK을 사용하는 다른 저장 프로시저(Stored Procedure)의 호출 여부에 관계없이 저장 프로시저(Stored Procedure)로 COMMIT/ROLLBACK을 사용할 수 있습니다.

각 BEGIN TRANSACTION 문은 카운터를 증가시키고 각 COMMIT 문은 카운터를 감소시킵니다. 카운터가 0이 되면 적합한 COMMIT을 실행합니다. 카운터의 현재 값은 시스템 변수 "@@TRANCOUNT"에 있습니다.


중첩된 Transact-SQL 프로시저

중첩 Transact-SQL 프로시저에 있는 오류는 부모 프로시저에게 치명적인 영향을 주지 않습니다. 그리하여 부모 프로시저는 하위 프로시저에서 발생한 치명적인 오류를 처리하기 위한 임시 계획(Plan)을 실행할 수 있습니다.

SQL Server 4.2에서 부모 프로시저는 하위 프로시저가 반환된 후 @@ERROR 상태를 확인해야 합니다. @@ERROR는 대부분의 Transact-SQL 문에 의해 설정되므로 @@ERROR가 변경되기 전에 RETURN을 수행해야 합니다.

치명적이지 않은 오류가 발생했다고 부모 프로시저에 신호를 보내려면 하위 프로시저에 RAISERROR와 함께 @@ERROR를 설정합니다. @@ERROR 값을 유지하려면 RETURN을 사용하여 자세히 지켜봐야 합니다. 치명적인 오류의 경우 RAISERROR는 불필요하며 RETURN은 자동입니다.

SQL Server 6.0을 시작하면 RETURN 문을 통해 하위 프로시저로부터의 상태 정보를 반환할 수 있습니다.

속성

기술 자료: 44519 - 마지막 검토: 2003년 5월 5일 월요일 - 수정: 2.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft SQL Server 4.21a Standard Edition
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
키워드:?
kbprg ssrvtran_sql ssrvwinnt ssrvserver KB44519

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com