【问题标题】:restoring error in sql Try Block not being caught在 sql Try Block 中恢复错误未被捕获
【发布时间】:2015-01-10 07:41:28
【问题描述】:

我编写了一个从给定 .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 设置为 @重复值到 1

【问题讨论】:

  • @usr 伙计他们是怪物:P ppl 的投票率高于我的总代表 O.O

标签: sql-server try-catch database-restore


【解决方案1】:

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

SET XACT_ABORT ON 在脚本的开头。

MSDN SET XACT_ABORT settings

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。

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

【讨论】:

  • 我的情况很少见,不过,我会试试你的建议。除非我在尝试您的方法后的几天内没有遇到错误,否则无法判断。完成后我会将其标记为答案 :) 感谢您考虑这么老的问题
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2019-05-19
  • 2020-05-09
  • 2012-08-06
  • 2022-07-19
相关资源
最近更新 更多