“Cannot drop database “” because it is currently in use” Hatasının Çözümü
Veritabanını silmek istediğinizde eğer veritabanı üzerinde açık session varsa bu hatayı alırsınız. Veritabanını aşağıdaki gibi önce single_user mode’a alıp daha sonra silebilirsiniz.
USE [master] GO ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO DROP DATABASE [Test] GO
Yukarıdaki script ile veritabanındaki açık connection’ları kapatıp veritabanını sadece kendimiz kullanabileceğimiz şekilde single_user olarak set ediyoruz ve daha sonra da siliyoruz. Eğer veritabanı zaten single_user’daysa başka biri daha önce veritabanını single_user mode’a almış demektir ve aşağıdaki gibi bir hata alırsınız.
Msg 5064, Level 16, State 1, Line 3
Changes to the state or options of database ” cannot be made at this time. The database is in single-user mode, and a user is currently connected to it.
Msg 5069, Level 16, State 1, Line 3
ALTER DATABASE statement failed.
Msg 3702, Level 16, State 4, Line 5
Cannot drop database “” because it is currently in use.
Veritabanı üzerindeki açık olan tüm session’ları manual olarak kill etmek için aşağıdaki sorguyu çalıştırmalısınız. Test yazaran yere kendi veritabanı adınızı yazmalısınız.
select * from sys.sysprocesses where dbid=DB_ID('Test')
Sorgu sonucunda dönen kayıtlar bu veritabanı üzerindeki process’lerdir. Bunların session_id’lerini bulup kill edip veritabanını silebilirsiniz. Örneğin session_id’si 55 ise kill 55 demelisiniz. Sorguları kill etmeden önce ilgili kişiyi bulup sormanız daha güvenli olacaktır. Eğer gerek olmadığını düşünüyorsanız aşağıdaki script ile ilgili veritabanındaki tüm session’ları otomatik olarak kill edebilirsiniz.
declare @Sql varchar(1000), @veritabaniadi varchar(100) set @veritabaniadi = 'Buraya Veritabanı Adını Yazmalısınız' set @Sql = '' select @Sql = @Sql + 'kill ' + convert(char(10), spid) + ' ' from master.dbo.sysprocesses where db_name(dbid) = @veritabaniadi and dbid <> 0 and spid <> @@spid exec(@Sql) GO