Saya ingin mengubah nama database, tetapi tetap mendapatkan kesalahan yang 'tidak't mendapatkan exclusive lock' pada database, yang berarti ada hubungan(s) masih aktif.
Bagaimana saya bisa membunuh semua koneksi ke database sehingga saya dapat nama itu?
Lihat Membunuh Semua Sambungan Aktif Ke Database.
Alasan bahwa pendekatan yang Adam suggested tidak't bekerja adalah bahwa selama waktu yang anda perulangan di atas sambungan aktif baru dapat dibentuk, dan anda'll kehilangan mereka. Artikel saya terkait dengan 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
Script untuk mencapai hal ini, mengganti 'DB_NAME' dengan database untuk membunuh 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
Membunuh itu, dan membunuh 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:
Pada Object Explorer pohon bor di bawah Manajemen untuk "Memantau Aktivitas" (jika anda tidak dapat menemukan di sana kemudian klik kanan pada database server dan pilih "Memantau Aktivitas"). Membuka Activity Monitor, anda dapat melihat semua info proses. Anda harus bisa menemukan kunci untuk database anda're tertarik dan membunuh orang-orang kunci, yang juga akan membunuh hubungan.
Anda harus mampu untuk mengubah nama setelah itu.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Ambil offline membutuhkan waktu dan kadang-kadang saya mengalami beberapa masalah dengan itu..
Paling solid dalam pendapat saya:
Lepas Klik kanan DB -> Tugas -> Melepaskan... periksa "Drop Koneksi" Ok
Kembali Klik kanan Database -> Melampirkan.. Tambahkan... -> pilih database anda, dan mengubah Melampirkan Sebagai kolom untuk nama database yang anda inginkan. Ok
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 'master' database dan menjalankan query ini, itu akan membunuh semua sambungan aktif dari database anda.
Saya biasanya lari ke yang error ketika saya mencoba untuk mengembalikan database saya biasanya hanya pergi ke atas pohon di Studio Manajemen dan klik kanan dan restart database server (karena itu's pada pengembangan mesin, ini mungkin tidak menjadi pilihan yang di produksi). Ini adalah menutup semua koneksi database.
Berikut ini's bagaimana untuk andal hal semacam ini di MS SQL Server Management Studio 2008 (dapat bekerja untuk versi lain juga):
Lain "membunuh dengan api" pendekatan adalah untuk me-restart layanan MSSQLSERVER. Saya ingin melakukan hal-hal dari commandline. Paste ini persis ke CMD akan melakukan hal ini: NET STOP MSSQLSERVER & BERSIH MULAI MSSQLSERVER
Atau buka "jasa.msc" dan menemukan "SQL Server (MSSQLSERVER)" dan klik kanan, pilih "restart".
Ini akan "tentu, tentu," membunuh SEMUA koneksi ke SEMUA database yang berjalan pada contoh di atas.
(Saya suka ini lebih baik dari banyak pendekatan yang mengubah dan berubah kembali konfigurasi pada server/database)
Pilihan bekerja untuk saya dalam skenario ini adalah sebagai berikut:
Klik kanan pada nama database, klik Properti untuk mendapatkan properti jendela, Buka tab Pilihan dan mengubah "Membatasi Akses" properti dari Multi User untuk Satu Pengguna. Ketika anda menekan tombol OK, maka akan meminta anda untuk menutup semua koneksi, pilih "Ya" dan anda siap untuk mengubah nama database....
Ini didn't bekerja untuk saya (SQL2008 Perusahaan), saya juga tidak't melihat proses yang sedang berjalan atau pengguna yang terhubung ke DB. Restart server (klik Kanan pada Sql Server Management Studio dan pilih Restart) memungkinkan saya untuk mengembalikan DB.
I'm menggunakan SQL Server 2008 R2, DB saya sudah set untuk pengguna tunggal dan ada sambungan yang dibatasi tindakan apapun pada database. Dengan demikian direkomendasikan SQLMenace's solusi menjawab dengan kesalahan. Di sini adalah salah satu yang bekerja dalam kasus saya.
Saya menggunakan sp_who untuk mendapatkan daftar dari semua proses di database. Ini lebih baik karena anda mungkin ingin meninjau proses mana untuk membunuh.
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 KillCommand kolom untuk membunuh proses yang anda ingin.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;