Pastikan Anda tidak memiliki dependensi seperti snapshot basis data pada db yang ingin Anda hapus. Padahal, pesan kesalahan akan terlihat sebaliknya. Apakah Anda yakin tidak ada proses tersembunyi yang menghubungkan ke database Anda? Pendekatan yang baik adalah dengan menjalankan skrip yang membunuh semua sesi dan segera setelah mengubah nama database menjadi nama lain dan kemudian drop database.
buat kursor berdasarkan pada pilih ini:
select d.name , convert (smallint, req_spid) As spid
from master.dbo.syslockinfo l,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysdatabases d
where l.rsc_type = v.number
and v.type = 'LR'
and l.req_status = x.number
and x.type = 'LS'
and l.req_mode + 1 = u.number
and u.type = 'L'
and l.rsc_dbid = d.dbid
and rsc_dbid = (select top 1 dbid from
master..sysdatabases
where name like 'my_db')
masalah di dalam kursor:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
setelah kursor ditutup dan tidak dialokasikan:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
Sesi yang terhubung ke basis data lain mungkin memiliki transaksi terbuka yang juga memengaruhi basis data Anda - sp_who2 hanya akan menampilkan satu basis data. Itu bisa juga sesuatu yang sederhana seperti Obyek Explorer atau Rincian Obyek Explorer terbuka di SSMS, yang lagi-lagi hanya akan menampilkan satu database di sp_who2.
Jangan repot-repot mencari sesi yang bertanggung jawab; bunuh saja semuanya dengan satu pernyataan (dan pastikan itu bukan salinan SSMS Anda yang terhubung, mis. jendela kueri lain, Object Explorer, dll.):
Sekarang Anda dapat menjatuhkannya, dan melakukannya menggunakan DDL, bukan UI:
sumber
USE master
, kalau begituDROP DATABASE dbname
. Rupanya yang dibutuhkan hanyalah "menggunakan" sesuatu yang lain, untuk melepaskan db.Apa basis data Anda saat ini ketika Anda mengeluarkan
DROP
perintah? Coba ini:Pastikan juga Anda terhubung sebagai
sa
dan bukandbo
pada basis data apa pun yang ingin Anda jatuhkan.sumber
Bagaimana kalau hanya melihat apa yang dilakukan SSMS saat Anda menggunakan UI tetapi suruh untuk mengeluarkan skrip untuk tindakan? Inilah yang dilakukan SSMS ketika Anda mengklik kanan DB dan memilih Hapus, lalu centang kotak untuk menutup koneksi yang ada:
sumber
Saya telah menghadapi situasi ini berkali-kali dan di bawah ini adalah apa yang saya lakukan:
Ketika metode yang jelas tidak berhasil ..... (seperti dalam situasi Anda):
Cari tahu ID basis data dari sysdatabases.
Kemudian jalankan -
sp_lock
yang akan menunjukkan semua kunci pada instance bersama dengan spid dan dbid.Bunuh spid dengan dbid yang sedang Anda coba offline atau jatuhkan.
Padahal, prosesnya agak manual, bisa otomatis seperti di bawah ini:
sumber
Menemukan jawaban yang sangat sederhana di StackOverflow yang berfungsi pertama kali untuk saya:
https://stackoverflow.com/a/7469167/261405
Inilah SQL dari jawaban itu:
sumber