J'ai une base de données de développement qui est fréquemment redéployée à partir d'un projet de base de données Visual Studio (via une construction automatique TFS).
Parfois, lorsque je lance ma construction, j'obtiens cette erreur :
ALTER DATABASE failed because a lock could not be placed on database 'MyDB'. Try again later.
ALTER DATABASE statement failed.
Cannot drop database "MyDB" because it is currently in use.
J'ai essayé ceci :
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
mais je ne peux toujours pas déposer la base de données. (Mon avis est que la plupart des développeurs ont un accès dbo
).
Je peux exécuter manuellement SP_WHO
et commencer à tuer les connexions, mais j'ai besoin d'un moyen automatique de le faire dans l'auto build. (Bien que cette fois ma connexion soit la seule sur la base de données que j'essaie de supprimer).
Existe-t-il un script qui peut supprimer ma base de données indépendamment de qui est connecté ?
Mise à jour
Pour MS SQL Server 2012 et plus
USE [master];
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id('MyDB')
EXEC(@kill);
Pour MS SQL Server 2000, 2005, 2008
USE master;
DECLARE @kill varchar(8000); SET @kill = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses
WHERE dbid = db_id('MyDB')
EXEC(@kill);
USE master
GO
ALTER DATABASE database_name
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
Ref : http://msdn.microsoft.com/en-us/library/bb522682%28v=sql.105%29.aspx
Vous pouvez obtenir le script fourni par SSMS en procédant comme suit :
Le script ressemblera à ceci :
USE [master]
GO
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
DROP DATABASE [YourDatabaseName]
GO