在 SQL Server 2008 R2 中重命名数据库时出错
Posted
技术标签:
【中文标题】在 SQL Server 2008 R2 中重命名数据库时出错【英文标题】:Error on renaming database in SQL Server 2008 R2 【发布时间】:2013-05-22 06:53:45 【问题描述】:我正在使用这个查询来重命名数据库:
ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]
但是执行的时候报错:
消息 5030,第 16 级,状态 2,第 1 行 无法以独占方式锁定数据库以执行该操作。
我的查询有什么问题吗?
【问题讨论】:
查询没有问题——错误是告诉你有其他连接连接到数据库,所以此时不允许重命名。 如果您从 SSMS 执行此操作,请确保您没有针对该数据库打开查询窗口,因为这是一个单独的连接,会锁定该数据库。 【参考方案1】:您可以尝试将数据库设置为单用户模式。
https://***.com/a/11624/2408095
use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER
【讨论】:
是WITH ROLLBACK IMMEDIATE
必要的。如果完全不使用,会不会出问题?
有点晚了,但要回答这个问题:是的,您应该在更改其他用户可能正在操作的数据库时使用WITH ROLLBACK IMMEDIATE
,以确保这些操作的完整性。但是在将数据库再次设置回 MULTI_USER 模式时,实际上并没有必要,因为数据库已经处于 SINGLE_USER 模式,并且您是唯一能够运行任何事务的用户。【参考方案2】:
将数据库设置为单一模式:
ALTER DATABASE dbName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
尝试重命名数据库:
ALTER DATABASE dbName MODIFY NAME = NewName
将数据库设置为多用户模式:
ALTER DATABASE NewName
SET MULTI_USER WITH ROLLBACK IMMEDIATE
【讨论】:
@SamieyMehdi 我应该将WITH ROLLBACk IMMEDIATE
用于多用户吗?【参考方案3】:
在SQL Server Management Studio (SSMS)中:
您也可以在对象资源管理器中右键单击您的数据库并转到属性。从那里转到选项。一直向下滚动并将限制访问设置为SINGLE_USER。更改您的数据库名称,然后返回并将其设置回 MULTI_USER。
【讨论】:
快速简单! 太完美了。使用 SQL Server 2017【参考方案4】:首先尝试关闭与数据库的所有连接:
use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER
取自here
【讨论】:
【参考方案5】:这是为我做的:
USE [master];
GO
ALTER DATABASE [OldDataBaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_renamedb N'OldDataBaseName', N'NewDataBaseName';
-- Add users again
ALTER DATABASE [NewDataBaseName] SET MULTI_USER
GO
【讨论】:
【参考方案6】:那是因为其他人正在访问数据库。将数据库置于单用户模式,然后重命名。
此链接可能会有所帮助:http://msdn.microsoft.com/en-IN/library/ms345378(v=sql.105).aspx
还有:http://msdn.microsoft.com/en-us/library/ms345378.aspx
【讨论】:
【参考方案7】:1.database设置第一单用户模式
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE
2.重命名数据库
ALTER DATABASE BOSEVIKRAM 修改名称 = [BOSEVIKRAM_Deleted]
3.DATABAE设置多用户模式
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER WITH ROLLBACK IMMEDIATE
【讨论】:
【参考方案8】:将数据库更改为单用户模式,如其他答案所示
有时,即使在转换为单用户模式后,允许到数据库的唯一连接也可能正在使用中。
即使在转换为单用户模式后也要关闭连接尝试:
select * from master.sys.sysprocesses
where spid>50 -- don't want system sessions
and dbid = DB_ID('BOSEVIKRAM')
查看结果并查看到相关数据库的连接 ID。
然后使用下面的命令关闭这个连接(应该只有一个,因为数据库现在是单用户模式)
杀死 connection_ID
将 connection_id 替换为第一次查询结果中的 ID
【讨论】:
【参考方案9】:另一种关闭所有连接的方法:
管理工具 > 查看本地服务
停止/启动“SQL Server (MSSQLSERVER)”服务
【讨论】:
【参考方案10】:对我来说,我无法重命名数据库的原因是因为存在活动连接。 我只是先使数据库脱机,勾选 Drop All Active Connections。 然后再次上线,我已经可以重命名数据库了。
【讨论】:
【参考方案11】:use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE
exec sp_renamedb 'BOSEVIKRAM','BOSEVIKRAM_Deleted'
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER
【讨论】:
这与 Squid 的答案完全相同以上是关于在 SQL Server 2008 R2 中重命名数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章
自动启用命名管道和 TCP/IP 协议 SQL Server 2008 R2
sql server 2008 r2 无法登陆localhost服务器
使用 sql server 2008 R2 的远程过程调用失败