Souvent quand on essaye de restaurer une base de données, on se retrouve dans la situation où le serveur refuse la restauration parce qu'on a encore de transactions en attente. Même s'il ne s'agit pas de vrai transactions de mise à jour de base. Dans ces cas il faut aller rechercher les verrous et les supprimer un à un. Ca marche si on fait manuellement ce travail.
Mais qu'est ce qui ce passe si on a un serveur de tests qu'on a besoin de raffraichir automatiquement tout les jours avec une sauvegarde base de production ? On peut restaurer manuellement s'il y a des erreurs suite à la restauration. Mieux, on peut rajouter dans le script de restauration avant la restauration effective une suppression des verrous. Ci-dessous un exemple de script :
Use master
go
PRINT 'Supprimer les connexions actives'
declare @databasename nvarchar(100)
declare @sess_id int
declare @kill_session varchar(20)
set @databasename = N'Nom de la base de données'
DECLARE session_id_cursor CURSOR FOR
SELECT DISTINCT request_session_id FROM master.sys.dm_tran_locks WHERE resource_type = 'DATABASE' AND resource_database_id =
db_id(@databasename) and request_session_id<>@@spid
OPEN session_id_cursor
FETCH NEXT FROM session_id_cursor INTO @sess_id
WHILE @@FETCH_STATUS = 0
BEGIN
set @kill_session = 'kill '+ convert(varchar(10),@sess_id) + ';'
exec (@kill_session)
print 'Supprimé ' + cast(@sess_id as varchar(10))
FETCH NEXT FROM session_id_cursor
INTO @sess_id
END
CLOSE session_id_cursor
DEALLOCATE session_id_cursor
go
-- suivi par la restauration effective