2016-08-18 40 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

感謝您的回答,但這不行。我應該更清楚,但我遇到的是編譯錯誤...沒有得到真正的執行。 –

相關問題