gpt4 book ai didi

sql-server - sql Try Block中的恢复错误未被捕获

转载 作者:行者123 更新时间:2023-12-03 13:20:28 25 4
gpt4 key购买 nike

我编写了一个从给定的 .bak 文件恢复数据库的存储过程,并在 SQL Server 代理的作业中安排了这个过程。现在有时发生的情况是 .bak 文件不可用,或者被防病毒软件复制或扫描,或者上帝知道在我的还原过程中还有什么其他原因引发操作系统错误(文件被另一个进程访问)(并非总是如此,但有时) .
为了绕过它,我将我的 Restore 语句放在循环中的 try-catch 块中,如下所示,假设这可能会解决问题,但它不是那样工作的。以下是我的程序:

DECLARE @Repeat INT
SET @Repeat = 1

WHILE (@Repeat = 1)
BEGIN
BEGIN TRY
IF DB_ID('MyDBName') IS NOT NULL
BEGIN
DROP DATABASE MyDBName
END

SET @File = @Path+@File --@File contains valid values, no problem in them
print @File
RESTORE FILELISTONLY FROM DISK = @File
--print 'Restore Filelist Successful'

RESTORE DATABASE BSG FROM DISK = @File
WITH REPLACE, MOVE 'ABC_Data' TO 'D:\MyDBName\MyDBName.mdf',
MOVE 'ABC_Log' TO 'D:\MyDBName\MyDBName_1.ldf'
SET @Repeat = 0
--print 'Restore Database Successful'
--print 'Move Successful'
END TRY
BEGIN CATCH
print 'Error Occured'
SET @Repeat = 1
END CATCH
END

请注意,我的程序在大多数情况下都可以正常工作,比如 7/10,但有时当我看到工作历史记录时,我会在失败报告中看到以下错误:
Executed as user: NT AUTHORITY\SYSTEM. In Transaction [SQLSTATE 01000] (Message 0)
'*MyBackupDBFilePath*' [SQLSTATE 01000] (Message 0) Cannot open backup device
'*MyBackupDBFilePath*'. Operating system error 32(The process cannot access the file
because it is being used by another process.). [SQLSTATE 42000] (Error 3201).
The step failed.

我可以看到在访问我的 .bak 文件时存在一些问题,但我不明白的是为什么我的程序不尝试再次恢复数据库(基本上为什么失败没有被我的 catch 捕获,它将 @repeat 值设置为1

最佳答案

我遇到了 TRY CATCH 的问题发生错误时块不会跳闸,这与阻止整个块执行的错误有关。例如,如果您有一个 try catch 块,用于在发生故障时回滚事务并且遇到不存在的列。这不是解析错误,而是阻止执行的错误,因此它完全失败了。如果我包含一个
SET XACT_ABORT ON在脚本的开头。

MSDN SET XACT_ABORT settings

When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.



希望这对你有帮助。如果没有,使用它仍然是一个好主意,我们在使用 TRY CATCH 的工作中使用它。块以防万一列被删除或类似的东西。

关于sql-server - sql Try Block中的恢复错误未被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27873976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com