때 BACKUP DATABASE
오류가 발생, 실제로 두 가지를 생성합니다. 불행히도 TRY/CATCH
첫 번째 오류를 캡처 할 수 없습니다. 두 번째 오류 만 캡처합니다.
나는 실패한 백업을 통해 백업을 자동화하는 것입니다 뒤에 가장 좋은 건 진짜 이유를 캡처하는 의심 SQLCMD (과 -o
출력을 파일로 보내), SSIS는, C #을, PowerShell을 등 모두있는 캡처를 통해 당신에게 훨씬 더 큰 제어를 제공합니다 모든 오류 중.
의견의 SO 답변은 사용을 제안합니다 DBCC OUTPUTBUFFER
-가능하지만 이것은 어린이의 놀이처럼 보이지 않습니다. 와 재미를 자유롭게 ERLAND Sommarskog의 사이트에서이 절차 있지만, 여전히와 함께 잘 작동하지 않는 것 같습니다 TRY/CATCH
.
오류 메시지를 캡처 할 수있는 유일한 방법 spGET_LastErrorMessage
은 실제 오류가 발생하는 것입니다. TRY/CATCH
오류로 감싸면 오류가 삼켜지고 저장 프로 시저가 아무것도하지 않습니다.
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
EXEC dbo.spGet_LastErrorMessage;
END CATCH
SQL Server <2012에서는 오류를 직접 발생시킬 수 없지만 SQL Server 2012 이상에서는 가능합니다. 따라서이 두 변형이 작동합니다.
CREATE PROCEDURE dbo.dothebackup
AS
BEGIN
SET NOCOUNT ON;
EXEC sp_executesql N'backup that fails...';
END
GO
EXEC dbo.dothebackup;
EXEC dbo.spGET_LastErrorMessage;
또는 2012 이상에서는 이것이 작동하지만 TRY/CATCH
원래 오류가 계속 발생하기 때문에의 목적을 크게 상실합니다 .
CREATE PROCEDURE dbo.dothebackup2
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
THROW;
END CATCH
END
GO
EXEC dbo.dothebackup2;
EXEC dbo.spGET_LastErrorMessage;
이 두 경우 모두 물론 오류는 여전히 클라이언트에게 발생합니다. 그래서 당신이 TRY/CATCH
그것을 피하기 위해 사용한다면 , 내가 생각하지 않는 허점이 없다면, 당신이 선택해야 할 것을 두려워합니다 ... 사용자에게 오류를주고 세부 사항을 포착 할 수 있습니다 또는 오류와 실제 이유를 모두 억제합니다.