web-dev-qa-db-ja.com

データベースが復元状態のままになるのはなぜですか?

データベースのデータを操作する単体テストがあります。すべてのテストを通じてデータベースの状態が常に同じであることを保証するために、database snapshotこれらのテストの開始時。

復元コードは次のようになります。

USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY
ALTER DATABASE {0} SET MULTI_USER

この後、テストはデータベースに接続し、必要なことをすべて実行します。

問題は、テストのデバッグ中に、最終的にstopボタンを押してテストをキャンセルする必要がある場合、データベースがRestoring状態で永久に残されることです。デバッグセッションを停止したときにのみ発生するので、これは奇妙です。 20個のテストがあり、それらすべてがテスト前のスナップショットを復元した場合、これらのテストの実行中にエラーは発生しません。

これを引き起こしている可能性があることについて何か提案はありますか?

[〜#〜]編集[〜#〜]

@usrの応答を補完し、テストの開始時に不整合な状態からデータベースを回復するには、REPLACEオプションをrestoreステートメントに追加する必要があります。

次のような場合に機能します。

USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY, REPLACE
ALTER DATABASE {0} SET MULTI_USER
6
andrerpena

RESTOREを途中で中止すると、データベースは使用できない状態になります。これは理にかなっています。古いページもあれば、新しいページもあります。

デバッガーを停止すると、クライアントプロセスが強制終了され、SQL Serverは接続と関連するすべてのセッションおよび要求を強制終了します。

これを機能させるには、中断された最後の復元手順を再開します。あなたの場合、もう一度スナップショットから復元してください。

6
usr