SQL Server comment gérer l'erreur : Error 1807 Could not obtain exclusive lock on database ‘model’.
Toutefois, je tiens à rappeler que ce scénario est probablement lié à un traitement de création de base de données et de sa transformation. Dans ces circonstances, il est probable que des connexions ouvertes trainent quelque part via l'éxecution de processus CI / CD, ligne de commande ou une application dont vous n'avez même pas connaissance effectue ce genre d'opérations. Si cela vient à se reproduire, je vous invite à faire un peu d'audit sur les opérations qui s'effectuent afin de trouver le coupable à la source.
Quoi qu'il en soit, vous vous retrouvez avec cette erreur et vous êtes incapable de créer de nouvelles base de données. C'est facheux :D, le billet permet de voir les étapes à suivre pour résoudre votre probléme.
Afin de résoudre votre probléme il faudra procéder en deux étapes. La première consiste à trouver les connexions coupable. Puis à tuer les coupables. Et oui, en informatique on ne fait pas dans "la dentelle de saint galle" ce qui est en total opposition de ce que mon chef se retrouve à faire avec les équipes métiers en fait :P. A chacun ces pratiques, la tronçonneuse ou le scapel... Personnellement, je suis assez joueur du coup, je varie les plaisir :) c'est aussi ce qui permet d'être en adéquation à toutes les circonstances...
Bref, pour revenir à nous moutons. Ci dessous vous trouverez une portion de code permettant de chercher les connexions qui vous pose probléme :
La démarche va consister à chercher les connexions qui sont ouverte :
IF EXISTS (
SELECT
request_session_id
FROM
sys.dm_tran_locks
WHERE
resource_database_id = DB_ID(
'model'
)
)
BEGIN
PRINT
'Model Database in use!!'
SELECT
*
FROM
sys.dm_exec_sessions
WHERE
session_id
IN
(
SELECT
request_session_id
FROM
sys.dm_tran_locks
WHERE
resource_database_id = DB_ID(
'model'
)
)
END
ELSE
PRINT
'Model Database not in used.'
Puis pour finir le travail en assassinant les coupables sans jugement :
SELECT 'KILL ' + CONVERT(varchar(10), l.request_session_id)
FROM sys.databases d, sys.dm_tran_locks l
WHERE d.database_id = l.resource_database_id
AND d.name = 'model'
Affaire à suivre.