서버 간 원격 저장 프로시저의 오류 처리

SQL Server의 로컬 인스턴스에서 클라이언트로 원격 저장 프로시저 및 일괄 처리를 실행할 때 문 및 일괄 처리 중단 오류가 발생할 수 있습니다.

  • 문 중단 오류가 발생하는 경우 오류를 발생시킨 문은 종료되지만 원격 저장 프로시저나 일괄 처리의 실행은 계속됩니다.

  • 일괄 처리 중단 오류가 발생하는 경우 전체 원격 저장 프로시저나 일괄 처리의 실행이 종료됩니다.

  • 원격 저장 프로시저 및 일괄 처리가 TRY 블록의 범위 내에서 실행되는 경우 TRY…CATCH 구문으로 일괄 처리 중단 오류를 처리할 수 있습니다.

문 및 일괄 처리 중단 오류의 결과로 나타나는 원격 저장 프로시저 및 일괄 처리 동작은 로컬 서버의 SET XACT_ABORT 설정에 따라 달라집니다.

SET XACT_ABORT가 OFF인 경우

로컬 서버에서 SET XACT_ABORT가 OFF인 경우 원격 저장 프로시저의 모든 문 중단 오류가 로컬 서버에 의해 문 중단 오류로 클라이언트에 전파됩니다. 오류를 발생시킨 문만 종료됩니다. 클라이언트는 문 중단 오류에 해당하는 오류 메시지를 받습니다. 또한 원격 저장 프로시저가 완료될 때까지 실행되면 @@ERROR에서 0을 반환합니다. 오류가 TRY 블록의 범위 내에서 발생하는 경우 실행이 계속되고 CATCH 블록이 호출되지 않습니다.

모든 원격 저장 프로시저의 일괄 처리 중단 오류가 로컬 서버에 의해 클라이언트로 전파됩니다. 원격 저장 프로시저를 호출한 EXECUTE 문은 종료되지만 EXECUTE 문이 포함된 일괄 처리 또는 저장 프로시저는 계속 실행됩니다. 따라서 @@ERROR에서는 원격 저장 프로시저를 종료한 오류에 해당하는 오류 코드를 반환하고 저장 프로시저의 반환 값은 NULL이 됩니다. 오류를 발생시키는 원격 저장 프로시저를 로컬 서버의 TRY 블록 범위 내에서 실행하면 발생하는 오류로 인해 컨트롤에서 원격 서버의 마지막 오류에 대한 정보를 CATCH 블록으로 전달합니다.

오류를 해결할 때 TRY…CATCH 구문의 TRY 블록 내에서 원격 저장 프로시저를 실행하십시오. 원격 저장 프로시저가 성공적으로 완료되지 않은 경우에는 원격 서버의 마지막 오류에 대한 정보가 있는 로컬 서버에 연결된 CATCH 블록으로 실행이 이동합니다. 원격 저장 프로시저가 성공적으로 완료된 경우에는 로컬 서버의 TRY 블록 내에서 실행이 계속되고 원격 저장 프로시저의 반환 값이 사용될 수 있습니다.

또한 TRY 블록의 범위 밖에서 원격 저장 프로시저를 실행할 때는 원격 저장 프로시저의 끝에서 @@ERROR를 검사하여 원격 프로시저가 완료되는지 여부를 확인하십시오. @@ERROR가 0이면 원격 저장 프로시저가 성공적으로 실행되었으며 저장 프로시저의 반환 값이 사용될 수 있습니다. @@ERROR가 0이 아니면 원격 저장 프로시저가 성공적으로 완료되지 않고 저장 프로시저의 반환 값이 사용될 수 없습니다.

SET XACT_ABORT가 ON인 경우

로컬 서버에서 SET XACT_ABORT가 ON인 경우 설정은 연결된 서버로 전파됩니다. 원격 저장 프로시저의 모든 문 및 일괄 처리 중단 오류는 로컬 서버의 일괄 처리 중단 오류로 변환됩니다. 그러므로 원격 저장 프로시저를 호출한 일괄 처리 또는 저장 프로시저의 실행이 원격 저장 프로시저와 함께 종료됩니다. 오류를 발생시키는 원격 저장 프로시저를 로컬 서버의 TRY 블록 범위 내에서 실행하면 발생하는 오류로 인해 컨트롤에서 원격 서버의 마지막 오류에 대한 정보를 CATCH 블록으로 전달합니다.

원격 저장 프로시저가 TRY 블록의 범위 밖에서 실행되는 경우 EXECUTE 문 다음의 문이 실행되지 않기 때문에 @@ERROR 값을 검사하여 일괄 처리 오류가 발생했는지 확인할 수 없습니다. 따라서 TRY…CATCH 구문의 TRY 블록 내에서 원격 저장 프로시저를 실행해야 합니다. 원격 저장 프로시저가 성공적으로 완료되지 않은 경우에는 원격 서버의 마지막 오류에 대한 정보가 있는 로컬 서버에 연결된 CATCH 블록으로 실행이 이동합니다. 원격 저장 프로시저가 제대로 완료된 경우에는 로컬 서버의 TRY 블록 내에서 실행이 계속되고 원격 저장 프로시저의 반환 값이 사용될 수 있습니다.

RAISERROR 및 TRY…CATCH

원격 저장 프로시저의 내부에서 20 미만의 심각도로 RAISERROR를 호출하면 원격 서버에서 문 중단 오류가 발생합니다. 로컬 서버의 TRY…CATCH 구문은 원격 일괄 처리 중단 오류만 처리합니다. 원격 저장 프로시저에서 20 미만의 심각도로 RAISERROR를 호출하고 원격 저장 프로시저의 범위가 로컬 서버의 TRY 블록 내에 있는 경우 RAISERROR는 컨트롤이 TRY…CATCH 구문의 CATCH 블록으로 전달되지 않도록 합니다. 그러나 원격 서버에서 심각도가 20 이상인 RAISERROR에 의해서는 연결이 끊어지고 로컬 서버에서의 실행이 CATCH 블록으로 전달됩니다.