2016-08-18 41 views
0

这是我的设置。每天一次,我的数据库的完整备份从生产服务器中检索并恢复到本地SQL Server实例。每隔15分钟,就会从生产中检索SQL事务日志并在本地恢复。我可以完成还原数据库备份并在同一存储过程中查询该数据库吗?

RESTORE DATABASE [DBNAME] from [email protected] with NORECOVERY, REPLACE) 
RESTORE LOG [DBNAME] from [email protected] with NORECOVERY 

在生产环境中发生故障的情况下,我需要能够使用本地数据库来代替。这意味着“完成了恢复”,并改变一些像这样的配置值:

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

我已经把这个代码在存储过程(在另一个数据库上相同的SQL Server实例)。然而,我无法执行它作为第二行导致错误:

Database 'DBNAME' cannot be opened. It is in the middle of a restore.

我认为,直到执行还原查询,这是由于前期验证由SQL Server引擎(因为DB不可用),但我想知道如何尽可能干净地解决它。我找到了一个解决方法,我在下面发布了一个答案,但它肯定不是解决问题的好方法。

感谢您的帮助!

+0

您可以在单独的事务中执行还原。 – NickyvV

回答

1

您应该能够通过将第二条语句在EXEC来解决此问题:

RESTORE DATABASE [DBNAME] with RECOVERY 
EXEC('UPDATE [DBNAME].dbo.[TABLE] SET [COL1] = 1') 

你可能看到的问题是,SQL服务器要之前编译整个存储过程开始执行。为了编译UPDATE,它至少需要确认所涉及的表和列的存在。

因此,把它放在一个EXEC,以便它不被编译,直到程序的一部分被达到。

+0

谢谢,我已经完成了它,它的作用就像一个魅力。简单,可读和功能。 我会等一会儿,然后接受你的答案,如果没有更好的一个。 –

0

我已经找到解决方法很简单:

  1. 创建一个执行数据库查询的存储过程。
  2. 在第一个存储过程中调用此SP。

但是,我想避免使用不必要的存储过程混淆我的SQL Server数据库,如果可能的话!

0

如果你知道大概需要恢复的时间,你可能会延迟它可能?

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

感谢您的回答,但这不行。我应该更清楚,但我遇到的是编译错误...没有得到真正的执行。 –

相关问题