Ketika BACKUP DATABASE
menghasilkan kesalahan, itu sebenarnya menghasilkan dua. Sayangnya TRY/CATCH
tidak mampu menangkap kesalahan pertama; hanya menangkap kesalahan kedua.
Saya menduga taruhan terbaik Anda untuk menangkap alasan sebenarnya di balik cadangan yang gagal adalah untuk mengotomatiskan cadangan Anda melalui SQLCMD (dengan -o
mengirim hasil ke file), SSIS, C #, PowerShell dll. Semua yang akan memberi Anda kontrol lebih besar untuk menangkap semua dari kesalahan.
Jawaban SO dalam komentar menyarankan menggunakan DBCC OUTPUTBUFFER
- selagi mungkin, ini sepertinya bukan permainan anak-anak sama sekali. Merasa bebas untuk bersenang-senang dengan prosedur ini dari situs Erland Sommarskog , tetapi ini masih tidak berfungsi dengan baik jika dikombinasikan TRY/CATCH
.
Satu-satunya cara saya tampaknya dapat menangkap pesan kesalahan spGET_LastErrorMessage
adalah jika kesalahan yang sebenarnya terjadi. Jika Anda membungkusnya dalam TRY/CATCH
kesalahan tertelan dan prosedur yang tersimpan tidak melakukan apa-apa:
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
EXEC dbo.spGet_LastErrorMessage;
END CATCH
Di SQL Server <2012 Anda tidak bisa menaikkan kembali kesalahan sendiri, tetapi Anda bisa di SQL Server 2012 dan yang lebih baru. Jadi dua variasi ini berfungsi:
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;
Atau pada 2012 dan di atas, ini berfungsi, tetapi sebagian besar mengalahkan tujuan TRY/CATCH
, karena kesalahan asli masih dilemparkan:
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;
Dalam kedua kasus ini, kesalahan masih terjadi pada klien, tentu saja. Jadi jika Anda menggunakan TRY/CATCH
untuk menghindari itu, kecuali ada beberapa celah yang tidak saya pikirkan, saya khawatir Anda harus membuat pilihan ... baik memberikan kesalahan kepada pengguna dan dapat menangkap detail tentang itu, atau menekan kesalahan dan alasan sebenarnya.