it-swarm-eu.dev

Proč je moje databáze zaseklá ve stavu Obnovení?

Mám nějaké testy jednotek, které manipulují s daty v databázi. Abychom zaručili, že stav databáze bude ve všech testech vždy stejný, snažíme se obnovit database snapshot na začátku těchto testů.

Obnovovací kód vypadá takto:

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

Poté se testy připojí k databázi a provedou vše, co je potřeba.

Problém je v tom, že během ladění testů, pokud musím nakonec stisknout tlačítko stop pro zrušení testů, databáze zůstane navždy ve stavu Restoring. Je to divné, protože se to stane, až když zastavím ladicí relaci. Pokud mám před testem 20 testů a všechny z nich obnoví snímek před testem, během těchto testů nedostanu žádnou chybu.

Máte nějaké návrhy, co by to mohlo způsobit?

UPRAVIT

Jako doplněk odezvy @ usr, chcete-li obnovit databázi z nekonzistentního stavu na začátku testů, je třeba do příkazu restore přidat možnost REPLACE.

Bude to fungovat, pokud je to takto:

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

Pokud zrušíte RESTORE uprostřed cesty, databáze je v nepoužitelném stavu. To dává smysl: Některé stránky jsou staré, některé nové.

Zastavení debuggeru zabije klientský proces, což způsobí, že SQL Server zabije připojení a všechny přidružené relace a požadavky.

Aby to fungovalo, restartujte poslední krok obnovení, který byl přerušen. V takovém případě obnovte snímek znovu.

6
usr