Answers:
我会说永远不要在GUI中使用“脱机”功能,除非您知道数据库未被使用的事实。随便什么。不做一些繁琐的工作就很难知道,那么为什么不把这个脚本保存在某个地方并一直使用呢?
USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;
然后是对等的:
ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;
您需要将其设置为“ SINGLE_USER
首先”的原因是将任何现有用户踢出去(在分离对话框中可以选择这样做,但是在“脱机”对话框中没有此选项),因为SQL Server需要对数据库的独占访问权才能执行它离线。现在,您可能仍要做一些额外的工作来查看谁当前正在使用数据库,就像您是在大型备份操作或ETL作业或您拥有的内容中进行此操作一样,这可能会出现问题。
编辑:我已经在Connect上对此提出了建议(请参阅Connect#2687832),并且也将其发布到了Trello(在“对象资源管理器”下归档)。
当您已经处于挂起状态时,请不要忘记您可以使用以下命令搜索整个服务器上的打开连接
sp_who2
在另一个数据库中,例如master。
扫描结果以查找您要使数据库脱机的任何位置。
注意这些行的spid(进程ID)列值。
一次运行
kill ##
其中“ ##”是spid。
当然,要确保这些进程对于保持运行状态并不重要...它们将在没有完成最新命令且没有任何警告的情况下终止。
ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
先发出...否则,它只能坐下来等待,对于繁忙的数据库,这可能是永远的。