データベースのデータを操作する単体テストがあります。すべてのテストを通じてデータベースの状態が常に同じであることを保証するために、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
RESTORE
を途中で中止すると、データベースは使用できない状態になります。これは理にかなっています。古いページもあれば、新しいページもあります。
デバッガーを停止すると、クライアントプロセスが強制終了され、SQL Serverは接続と関連するすべてのセッションおよび要求を強制終了します。
これを機能させるには、中断された最後の復元手順を再開します。あなたの場合、もう一度スナップショットから復元してください。