SQL Server 2008 R2中重命名数据库时出错

220

我正在使用以下查询来重命名数据库:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

但是执行时出现错误:

Msg 5030,Level 16,State 2,Line 1
数据库无法被独占锁定以执行该操作。

我的查询有什么问题吗?


4
查询语句本身没有问题,错误提示告诉你有其他连接正在使用该数据库,所以现在不允许你对其进行重命名。 - Damien_The_Unbeliever
2
如果您正在从SSMS执行此操作,请确保您没有打开针对该数据库的查询窗口,因为那是一个单独的连接,会在数据库上放置锁定。 - jleach
11个回答

415

你可以尝试将数据库设置为单用户模式。

https://dev59.com/CnVD5IYBdhLWcg3wWKLc#11624

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

2
WITH ROLLBACK IMMEDIATE 是否必要?如果我根本不使用它,会引起问题吗? - user13892
2
有点晚了,但是回答这个问题:在修改其他用户可能正在操作的数据库时,应该使用WITH ROLLBACK IMMEDIATE来确保这些操作的完整性。但是当将数据库重新设置为MULTI_USER模式时,这并不是真正必要的,因为数据库已经处于SINGLE_USER模式,而且只有您能运行任何事务。 - Hakan Yildizhan

82
  1. 将数据库设置为单用户模式:

  2. ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    
  3. 尝试重命名数据库:

    ALTER DATABASE dbName MODIFY NAME = NewName
    
  4. 将数据库设置为多用户模式:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE
    

1
@SamieyMehdi 我应该在多用户情况下使用 WITH ROLLBACK IMMEDIATE 吗? - BendEg

59
在SQL Server Management Studio(SSMS)中:
您还可以在“对象资源管理器”中右键单击数据库,然后进入“属性”。从那里,进入“选项”。向下滚动并将“限制访问”设置为“SINGLE_USER”。更改您的数据库名称,然后再次进入并将其设置回“MULTI_USER”。

3
快速简便! - ani627
太好了。正在使用SQL Server 2017工作。 - Adam Macierzyński

23

首先尝试关闭所有与数据库的连接:

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

取自此处


7
这对我有用:
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

5

1.将数据库设置为单用户模式

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE

2.重命名数据库

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3.将数据库设置为多用户模式

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER WITH ROLLBACK IMMEDIATE


5

3

按照其他答案中所示,将数据库更改为单用户模式。

有时,即使转换为单用户模式后,允许连接到数据库的唯一连接也可能正在使用中。

如果要在转换为单用户模式后关闭连接,请尝试:

select * from master.sys.sysprocesses
where spid>50 -- don't want system sessions
  and dbid = DB_ID('BOSEVIKRAM')

查看结果并查找有关数据库连接的ID。

然后使用以下命令关闭此连接(因为数据库现在处于单用户模式,所以应该只有一个连接)

KILL 连接_ID

将connection_id替换为第一次查询结果中的ID。


2
对我来说,无法重命名数据库的原因是因为有活动连接。我只需先将数据库脱机,并勾选“删除所有活动连接”。然后再将其联机,就可以重命名数据库了。Take Offline

enter image description here


0

关闭所有连接的另一种方法:

管理工具 > 查看本地服务

停止/启动 "SQL Server (MSSQLSERVER)" 服务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接