在 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 的远程过程调用失败

VS2013连接SQL Server 2008 R2测试

windows 2012 r2怎么安装sql server 2008 r2

怎么修改Windows server 2008 R2登录密码