เมื่อ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
เพื่อหลีกเลี่ยงปัญหานั้นเว้นแต่จะมีช่องโหว่บางอย่างที่ฉันไม่ได้คิดฉันกลัวว่าคุณจะต้องเลือก ... ให้ผู้ใช้เกิดข้อผิดพลาดและสามารถจับรายละเอียดเกี่ยวกับ หรือระงับทั้งข้อผิดพลาดและเหตุผลที่แท้จริง