一尘不染

SQL Server 无法删除数据库 <dbname>,因为它当前正在使用中...但没有显示会话

sql

当我尝试删除数据库时,我收到错误“无法删除数据库“dbname”,因为它当前正在使用中”。但是,当我运行时sp_who2,肯定没有会话连接到该数据库。我还将数据库设置为single_user mode with rollback immediate.

为什么会这样?


阅读 132

收藏
2022-10-25

共1个答案

一尘不染

确保您没有要删除的数据库上的数据库快照等依赖项。但是,错误消息看起来会有所不同。您确定没有隐藏进程连接到您的数据库吗?一个好的方法是运行一个脚本来杀死所有会话,并在将数据库重命名为另一个名称后立即删除数据库。

基于此选择创建一个游标:

  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')

游标内的问题:

SET @kill_process =  'KILL ' + @spid      
            EXEC master.dbo.sp_executesql @kill_process
                   PRINT 'killed spid : '+ @spid

游标关闭并释放后:

sp_dboption 'my_db', 'single user', 'TRUE'

go

sp_renamedb 'my_db', 'my_db_old'

go

DROP DATABASE MY_DB_OLD 
2022-10-25