2016-08-18 2 views
0

私の設定です。 1日に1回、DBのフルバックアップが運用サーバーから取得され、ローカルのSQL Serverインスタンスに復元されます。 15分ごとに、SQLトランザクションログが本番から検索され、ローカルに復元されます。DBバックアップの復元が完了し、同じストアドプロシージャ内のそのDBをクエリできますか?

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

本番環境に障害が発生した場合は、代わりにローカルDBを使用する必要があります。

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

私は(同じSQL Serverインスタンス上で別のDBに)ストアドプロシージャにこのコードを入れている:これは、「復元仕上げ」と、このようにいくつかの設定値を変更することを意味します。二行目でエラーが発生しかし、私はそれを実行することができません:

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

私はRESTOREクエリが実行されるまでのDBが利用できないので、これはSQL Serverエンジン(による検証を事前に起因していると仮定します)、私は可能な限りきれいにそれを回避する方法を知りたいです。私は以下の答えとして投稿した回避策を見つけましたが、問題を解決するには間違いなく素晴らしい方法です。

ありがとうございました!

+0

リストアは別のトランザクションで行うことができます。 – NickyvV

答えて

1

あなたはEXECで第二の文を置くことによってこの問題を回避することができるはずです。

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

あなたがそう見ている問題は、SQL Serverがその前に全体ストアドプロシージャをコンパイルしたいです実行を開始します。 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

答えをありがとうが、それは動作しません。私はより明確にすべきだったが、私が遭遇しているのはコンパイルエラーである...実際には何も実行されない。 –

関連する問題