当我尝试删除数据库时,我收到错误“无法删除数据库“dbname”,因为它当前正在使用中”。但是,当我运行时sp_who2
,肯定没有会话连接到该数据库。我还将数据库设置为single_user mode with rollback immediate
.
为什么会这样?
当我尝试删除数据库时,我收到错误“无法删除数据库“dbname”,因为它当前正在使用中”。但是,当我运行时sp_who2
,肯定没有会话连接到该数据库。我还将数据库设置为single_user mode with rollback immediate
.
为什么会这样?
连接到另一个数据库的会话可能有一个打开的事务,它也会影响您的数据库 - sp_who2 将只显示一个数据库。它也可以像在 SSMS 中打开的对象资源管理器或对象资源管理器详细信息一样简单,这同样只会在 sp_who2 中显示一个数据库。
不要费心去寻找负责的会话;只需用一个语句将它们全部杀死(并确保连接的不是您的 SSMS 副本,例如另一个查询窗口、对象资源管理器等):
现在您可以删除它,并使用 DDL 而不是 UI:
确保您没有要删除的数据库上的数据库快照等依赖项。但是,错误消息看起来会有所不同。您确定没有隐藏进程连接到您的数据库吗?一个好的方法是运行一个脚本来杀死所有会话,并在将数据库重命名为另一个名称后立即删除数据库。
基于此选择创建一个游标:
游标内的问题:
游标关闭并释放后:
当您使用 UI 并告诉它为该操作发出脚本时,仅查看 SSMS 的作用怎么样?当您右键单击数据库并选择删除,然后选中该框以关闭现有连接时,SSMS 会执行以下操作:
DROP
发出命令时,您当前的数据库是什么?尝试这个:还要确保您连接的
sa
不是dbo
您要删除的任何数据库。我多次遇到这种情况,以下是我的工作:
当明显的方法不起作用时.....(就像您的情况一样):
从 sysdatabases 中找出数据库 ID。
然后执行 -
sp_lock
这将显示实例上的所有锁以及 spid 和 dbid。使用您尝试脱机或删除的 dbid 杀死 spid。
虽然,这个过程有点手动,但它可以自动化如下:
在 StackOverflow 上找到了第一次对我有用的非常简单的答案:
https://stackoverflow.com/a/7469167/261405
这是该答案中的SQL: