Eu tenho alguns testes de unidade que manipulam dados em um banco de dados. Para garantir que o estado do banco de dados seja sempre o mesmo em todos os testes, estamos tentando restaurar a database snapshot
no início desses testes.
O código de restauração fica assim:
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
Depois disso, os testes se conectam ao banco de dados e fazem o que for necessário.
O problema é que, durante a depuração dos testes, se eventualmente eu precisar apertar o stop
botão para cancelar os testes, o banco de dados fica no Restoring
estado para sempre. É estranho porque só acontece quando eu paro a sessão de depuração. Se eu tiver 20 testes e todos eles restaurarem o snapshot antes do teste, não obterei nenhum erro durante essas execuções de teste.
Você tem alguma sugestão do que pode estar causando isso?
EDITAR
Complementando a resposta do @usr, para recuperar o banco de dados do estado inconsistente no início dos testes, é necessário adicionar a REPLACE
opção ao comando restore.
Vai funcionar se for assim:
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
Se você abortar no
RESTORE
meio do caminho, o banco de dados estará em um estado inutilizável. Isso faz sentido: algumas páginas são antigas, outras são novas.A interrupção do depurador encerra o processo do cliente, fazendo com que o SQL Server elimine a conexão e todas as sessões e solicitações associadas.
Para fazê-lo funcionar, reinicie a última etapa de restauração que foi interrompida. No seu caso, restaure a partir do instantâneo novamente.
Pode haver outra consulta ainda em execução no banco de dados original que está bloqueando o comando de restauração.
Primeiro, verifique o status do seu banco de dados:
Execute isto para ver se alguém está executando uma consulta em seu banco de dados:
Se sim, mate-os: