Jawaban:
Alasan bahwa pendekatan yang disarankan Adam tidak akan berhasil adalah bahwa selama Anda mengulangi koneksi aktif yang baru dapat dibuat, dan Anda akan melewatkannya. Anda bisa menggunakan pendekatan berikut yang tidak memiliki kelemahan ini:
-- set your current connection to use master otherwise you might get an error
use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--do you stuff here
ALTER DATABASE YourDatabase SET MULTI_USER
Skrip untuk menyelesaikan ini, ganti 'DB_NAME' dengan database untuk mematikan semua koneksi ke:
USE master
GO
SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''
Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END
and spid <> @@SPID
untuk SELECT @sKillConnection
pernyataan sehingga tidak akan mencoba untuk membunuh koneksi saya saat ini, yang akan menghasilkan pesan kesalahan.
Bunuh, dan bunuh dengan api:
USE master
go
DECLARE @dbname sysname
SET @dbname = 'yourdbname'
DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
Menggunakan SQL Management Studio Express:
Di pohon Object Explorer telusuri bawah Manajemen untuk "Monitor Aktivitas" (jika Anda tidak dapat menemukannya di sana kemudian klik kanan pada server database dan pilih "Monitor Aktivitas"). Membuka Monitor Aktivitas, Anda dapat melihat semua info proses. Anda harus dapat menemukan kunci untuk basis data yang Anda minati dan mematikan kunci itu, yang juga akan mematikan koneksi.
Anda harus dapat mengganti nama setelah itu.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Mengambil offline membutuhkan waktu dan kadang-kadang saya mengalami beberapa masalah dengan itu ..
Cara paling solid menurut saya:
Melepaskan Klik kanan DB -> Tugas -> Lepaskan ... centang "Drop Connections" Ok
Pasang kembali Klik kanan Database -> Lampirkan .. Tambah ... -> pilih basis data Anda, dan ubah kolom Lampirkan Sebagai ke nama basis data yang Anda inginkan. Baik
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'
Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select ' ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp
gunakan database 'master' dan jalankan query ini, itu akan mematikan semua koneksi aktif dari database Anda.
Saya biasanya mengalami kesalahan itu ketika saya mencoba mengembalikan database saya biasanya hanya pergi ke atas pohon di Management Studio dan klik kanan dan restart server database (karena itu pada mesin pengembangan, ini mungkin tidak ideal dalam produksi ). Ini menutup semua koneksi basis data.
ALTER DATABASE ... SET SINGLE_USER
perintah dalam jawaban lain mengembalikan kesalahan yang sama 'tidak bisa mendapatkan kunci eksklusif').
Di MS SQL Server Management Studio pada objek explorer, klik kanan pada database. Di menu konteks yang mengikuti, pilih 'Tugas -> Ambil Offline'
Pendekatan "bunuh dengan api" yang lain adalah dengan memulai kembali layanan MSSQLSERVER. Saya suka melakukan hal-hal dari commandline. Menempelkan ini ke CMD akan melakukannya: NET STOP MSSQLSERVER & NET START MSSQLSERVER
Atau buka "services.msc" dan cari "SQL Server (MSSQLSERVER)" dan klik kanan, pilih "restart".
Ini akan "pasti, pasti" membunuh SEMUA koneksi ke SEMUA database yang berjalan pada contoh itu.
(Saya suka ini lebih baik daripada banyak pendekatan yang mengubah dan mengubah kembali konfigurasi pada server / database)
Inilah cara andal hal semacam ini di MS SQL Server Management Studio 2008 (dapat juga digunakan untuk versi lain):
Opsi yang berfungsi untuk saya dalam skenario ini adalah sebagai berikut:
Coba ini:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Klik kanan pada nama database, klik Properti untuk mendapatkan jendela properti, Buka tab Opsi dan ubah properti "Batasi Akses" dari Multi Pengguna ke Pengguna Tunggal. Ketika Anda menekan tombol OK, itu akan meminta Anda untuk menutup semua koneksi yang terbuka, pilih "Ya" dan Anda ditetapkan untuk mengubah nama basis data ....
Ini tidak bekerja untuk saya (SQL2008 Enterprise), saya juga tidak bisa melihat proses yang berjalan atau pengguna yang terhubung ke DB. Restart server (Klik kanan pada Sql Server di Management Studio dan pilih Restart) memungkinkan saya untuk mengembalikan DB.
Saya menggunakan SQL Server 2008 R2, DB saya sudah ditetapkan untuk pengguna tunggal dan ada koneksi yang membatasi tindakan apa pun pada database. Dengan demikian solusi SQLMenace yang disarankan merespons dengan kesalahan. Ini salah satu yang berhasil dalam kasus saya .
Saya menggunakan sp_who untuk mendapatkan daftar semua proses dalam database. Ini lebih baik karena Anda mungkin ingin meninjau proses untuk membunuh yang mana.
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
Hasil
Anda dapat menggunakan perintah di kolom KillCommand untuk mematikan proses yang Anda inginkan.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
Anda dapat menggunakan perintah SP_Who dan membunuh semua proses yang menggunakan database Anda dan kemudian mengubah nama database Anda.