我是否可以完成恢复数据库备份并在同一存储过程中查询该数据库?

时间:2016-08-18 07:26:07

标签: sql-server

这是我的设置。每天一次,从生产服务器检索我的数据库的完整备份,并将其还原到本地SQL Server实例。每隔15分钟,就会从生产中检索一个SQL事务日志并在本地恢复。

RESTORE DATABASE [DBNAME] from disk=@path with NORECOVERY, REPLACE)
RESTORE LOG [DBNAME] from disk=@path with NORECOVERY

如果生产环境出现故障,我需要能够使用本地数据库。这意味着“完成恢复”并更改一些配置值,如下所示:

RESTORE DATABASE [DBNAME] with RECOVERY
UPDATE [DBNAME].dbo.[TABLE] SET [COL1] = 1

我已将此代码放在存储过程中(在同一SQL Server实例上的另一个DB中)。但是,由于第二行导致错误,我无法执行它:

  

无法打开数据库'DBNAME'。它正处于恢复过程中。

我认为这是由于SQL Server引擎的预验证(因为在执行RESTORE查询之前数据库不可用),但我想知道如何尽可能干净地解决它。我找到了一个解决方法,我在下面给出了答案,但它确定不是解决问题的好方法。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您应该可以通过将第二个语句放在EXEC

中来解决此问题
RESTORE DATABASE [DBNAME] with RECOVERY
EXEC('UPDATE [DBNAME].dbo.[TABLE] SET [COL1] = 1')

您可能会遇到的问题是SQL Server希望在开始执行之前编译整个存储过程。为了编译UPDATE,它至少需要确认所涉及的表和列的存在。

所以,把它放在EXEC中,这样就不会编译它,直到达到程序的那一部分。

答案 1 :(得分:0)

我发现的解决方法很简单:

  1. 创建一个在数据库上执行查询的存储过程。
  2. 在第一个存储过程中调用此SP。
  3. 但是,如果可能的话,我想避免使用不必要的存储过程来混乱我的SQL Server数据库!

答案 2 :(得分:0)

如果你知道恢复需要很长时间,你可能会延迟它吗?

restore database [DBName] with recovery;
Begin 
    waitfor delay '00:01';  --one minute delay 
        update [DBTable] set [Col1]= 1;
END;