我有一个开发数据库,经常从Visual Studio数据库项目重新部署(通过TFS自动构建)。
有时,当我运行我的构建时,我会得到这样的错误:
ALTER DATABASE failed because a lock could not be placed on database 'MyDB'. Try again later.
ALTER DATABASE statement failed.
Cannot drop database "MyDB" because it is currently in use.
我试过这个:
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
但我还是不能删除数据库。(我猜大多数开发人员都有dbo
访问权限。)
我可以手动运行SP_WHO
并开始终止连接,但我需要一种在自动构建中执行此操作的自动方法。(尽管这一次我的连接是我试图断开的数据库上唯一的连接。)
是否有脚本可以删除我的数据库,而不管连接的是谁?
发布于 2011-08-26 06:00:08
USE master
GO
ALTER DATABASE database_name
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
参考:http://msdn.microsoft.com/en-us/library/bb522682%28v=sql.105%29.aspx
发布于 2015-10-01 00:13:35
鲜为人知的是: GO sql语句可以接受一个整数来表示重复前一个命令的次数。
因此,如果您:
ALTER DATABASE [DATABASENAME] SET SINGLE_USER
GO
然后:
USE [DATABASENAME]
GO 2000
这将重复USE命令2000次,在所有其他连接上强制执行死锁,并取得单个连接的所有权。(给你的查询窗口独占的访问权去做你想做的事。)
发布于 2014-08-07 20:20:39
根据我的经验,使用SINGLE_USER在大多数情况下都很有用,但是要小心:我曾经经历过在启动SINGLE_USER命令和完成命令之间的情况……显然,另一个“用户”获得了SINGLE_USER访问权限,而不是我。如果发生这种情况,您将面临一项艰难的任务,即试图重新获得对数据库的访问权限(在我的示例中,它是为一个软件运行的特定服务,该软件具有比我更早获得SINGLE_USER访问权限的SQL数据库)。我认为应该是最可靠的方法(不能保证,但这是我未来几天会测试的),实际上是:
停止可能干扰您访问的服务(如果有)使用上面的'kill‘脚本关闭所有连接在此之后立即将数据库设置为single_user,然后执行恢复
https://stackoverflow.com/questions/7197574
复制相似问题