Wenn BACKUP DATABASE
ein Fehler generiert wird, werden tatsächlich zwei generiert. Leider TRY/CATCH
ist es nicht möglich, den ersten Fehler zu erfassen. es erfasst nur den zweiten Fehler.
Ich vermute, dass Ihre beste Möglichkeit, den wahren Grund für eine fehlgeschlagene Sicherung zu erfassen, darin besteht, Ihre Sicherungen über SQLCMD (mit -o
Ausgabe an eine Datei), SSIS, C #, PowerShell usw. zu automatisieren . All dies gibt Ihnen eine viel bessere Kontrolle über die Erfassung aller Sicherungen der Fehler.
Die SO-Antwort im Kommentar schlägt die Verwendung vor DBCC OUTPUTBUFFER
- obwohl dies möglich ist, scheint dies überhaupt kein Kinderspiel zu sein. Fühlen Sie sich frei, Spaß mit diesem Verfahren von Erland Sommarskogs Website zu haben , aber dies scheint in Kombination mit immer noch nicht gut zu funktionieren TRY/CATCH
.
Die einzige Möglichkeit, mit der ich die Fehlermeldung erfassen konnte, bestand darin, spGET_LastErrorMessage
den tatsächlichen Fehler auszulösen. Wenn Sie es in ein TRY/CATCH
einpacken, wird der Fehler verschluckt und die gespeicherte Prozedur führt nichts aus:
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
EXEC dbo.spGet_LastErrorMessage;
END CATCH
In SQL Server <2012 können Sie den Fehler nicht selbst erneut auslösen, in SQL Server 2012 und höher jedoch. Diese beiden Varianten funktionieren also:
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;
Oder ab 2012 funktioniert dies, macht aber den Zweck von weitgehend zunichte TRY/CATCH
, da der ursprüngliche Fehler immer noch ausgelöst wird:
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;
In beiden Fällen wird der Fehler natürlich immer noch auf den Client übertragen. Wenn Sie dies verwenden TRY/CATCH
, um dies zu vermeiden, müssen Sie leider eine Entscheidung treffen, es sei denn, es gibt eine Lücke, an die ich nicht denke. Geben Sie dem Benutzer entweder den Fehler und können Sie Details darüber erfassen es, oder unterdrücken Sie sowohl den Fehler als auch den tatsächlichen Grund.