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


164

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

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

但是执行时显示错误:

消息5030,级别16,状态2,行1
无法完全锁定数据库才能执行该操作。

我的查询有问题吗?


4
查询没有任何问题-错误是告诉您其他连接已连接到数据库,因此目前不允许您重命名该数据库。
Damien_The_Unbeliever

1
如果从SSMS进行此操作,请确保没有针对该数据库打开查询窗口,因为这是一个单独的连接,在数据库上设置了锁定。
jleach '16

Answers:


329

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

https://stackoverflow.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

1
WITH ROLLBACK IMMEDIATE必要的。如果我根本不使用它,会引起问题吗?
user13892

有点晚了,但是要回答这个问题:是的,您应该WITH ROLLBACK IMMEDIATE在更改其他用户可能在其上运行的数据库的同时使用,以确保这些操作的完整性。但是,再次将数据库重新设置为MULTI_USER模式时,这并不是真正必要的,因为该数据库已经处于SINGLE_USER模式,并且您是唯一能够运行任何事务的用户。
哈坎·伊尔迪詹

61
  1. 将数据库设置为单一模式:

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

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

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE

@SamieyMehdi我应该WITH ROLLBACk IMMEDIATE用于多用户吗?
BendEg

29

SQL Server Management Studio(SSMS)中

您也可以在 对象资源管理器中然后转到“ 属性”。从那里转到选项。一直向下滚动,然后将“ 限制访问”设置为SINGLE_USER。更改您的数据库名称,然后返回并重新设置为MULTI_USER


快捷方便!
ani627

那很完美。使用SQL Server 2017
AdamMacierzyński,

19

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

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

这里取


4

这为我做到了:

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


2

将数据库更改为单用户模式,如其他答案所示

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

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

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

查看结果,并查看与该数据库的连接的ID。

然后使用下面的命令关闭此连接(由于数据库现在处于单用户模式,因此只能建立一个连接)

杀死connection_ID

用第一个查询结果中的ID替换connection_id


1

1.数据库设置第一个单用户模式

具有立即回滚的ALTER DATABASE BOSEVIKRAM 设置 SINGLE_USER

2.重命名数据库

ALTER DATABASE BOSEVIKRAM 修改名称= [BOSEVIKRAM_Deleted]

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

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER,具有立即回滚


0

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

管理工具>查看本地服务

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


-1
use master

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE  

exec sp_renamedb 'BOSEVIKRAM','BOSEVIKRAM_Deleted'

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER

这与鱿鱼的答案完全一样
reggaeguitar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.