Parfois, lorsque (par exemple) définissez une base de données hors ligne en exécutant la commande suivante, une exception sera levée, car un ou plusieurs clients sont connectés:

ALTER DATABASE <dbname> SET OFFLINE

Selon cette réponse, une solution consiste à utiliser with rollback immediate à la fin:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

Pourquoi est-ce que cela déconnecte les autres clients? Cela ressemble à un moyen très peu évident de forcer les déconnexions, bien que cela fonctionne.

6
Jim Aho 4 janv. 2016 à 14:03

2 réponses

Meilleure réponse

Vous ne pouvez pas mettre la base de données hors ligne pendant que d'autres utilisateurs exécutent des transactions, vous devrez donc déconnecter les utilisateurs d'une manière ou d'une autre pour mettre la base de données hors ligne.

Si vous étiez poli, vous pourriez demander à tous vos utilisateurs de terminer ce qu'ils faisaient avant de mettre la base de données hors ligne.

Mais si ce n'est pas pratique, y compris l'option

WITH ROLLBACK IMMEDIATE

Signifie que toutes les transactions en cours sont annulées (la base de données est réinitialisée au point où la transaction a commencé). Vous pouvez également utiliser

WITH ROLLBACK AFTER 60 SECONDS

Mais je n'ai jamais eu à

Si vous pouviez mettre une base de données hors ligne alors que des transactions inachevées étaient en cours d'exécution, la base de données serait dans un état instable avec la modification ni effectuée ni annulée.

9
Tom Page 4 janv. 2016 à 14:53

Depuis MSDN

AVEC & lt; résiliation & gt; :: =

Spécifie quand annuler les transactions incomplètes lorsque la base de données passe d'un état à un autre. Si la clause de terminaison est omise, l'instruction ALTER DATABASE attend indéfiniment s'il existe un verrou sur la base de données. Une seule clause de terminaison peut être spécifiée et elle suit les clauses SET.

Où la résiliation serait ROLLBACK IMMEDIATE dans votre cas.

0
JodyT 4 janv. 2016 à 11:47