Lỗi khi đổi tên cơ sở dữ liệu trong SQL Server 2008 R2


164

Tôi đang sử dụng truy vấn này để đổi tên cơ sở dữ liệu:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Nhưng nó hiển thị một lỗi khi cắt bỏ:

Msg 5030, Cấp 16, Trạng thái 2, Dòng 1
Cơ sở dữ liệu không thể bị khóa độc quyền để thực hiện thao tác.

Có bất cứ điều gì sai với truy vấn của tôi?


4
Không có gì sai với truy vấn - lỗi cho bạn biết rằng các kết nối khác được kết nối với cơ sở dữ liệu, vì vậy bạn không được phép đổi tên nó vào lúc này.
Damien_The_Unbeliever

1
Nếu bạn đang làm điều này từ SSMS, hãy đảm bảo rằng bạn không mở cửa sổ truy vấn đối với db đó, vì đó là một kết nối riêng biệt đặt khóa trên db.
jleach

Câu trả lời:


329

Bạn có thể thử đặt cơ sở dữ liệu sang chế độ người dùng.

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 IMMEDIATEcần thiết Nếu tôi không sử dụng nó, nó sẽ gây ra vấn đề?
user13892

Đến bữa tiệc muộn, nhưng để trả lời câu hỏi này: có, bạn nên sử dụng WITH ROLLBACK IMMEDIATEtrong khi thay đổi cơ sở dữ liệu mà người dùng khác có thể đang hoạt động để đảm bảo tính toàn vẹn của các hoạt động này. Nhưng thực sự không cần thiết khi thiết lập lại cơ sở dữ liệu về chế độ MULTI_USER vì cơ sở dữ liệu đã ở chế độ SINGLE_USER và dù sao bạn cũng là người dùng duy nhất có thể chạy bất kỳ giao dịch nào.
Hakan Yildizhan

61
  1. Đặt cơ sở dữ liệu ở chế độ đơn:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  2. Cố gắng đổi tên cơ sở dữ liệu:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Đặt cơ sở dữ liệu ở chế độ Multiuser:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE

@SamieyMehdi Tôi có nên sử dụng WITH ROLLBACk IMMEDIATEcho nhiều người dùng không?
BendEg

29

Trong SQL Server Management Studio (SSMS) :

Bạn cũng có thể nhấp chuột phải vào cơ sở dữ liệu của mình trong Object Explorer và đi đến Thuộc tính . Từ đó, đi đến Tùy chọn . Cuộn tất cả xuống và đặt Hạn chế quyền truy cập vào SINGLE_USER . Thay đổi tên cơ sở dữ liệu của bạn, sau đó quay lại và đặt lại thành MULTI_USER .


Nhanh chóng và dễ dàng!
ani627

Thật hoàn hảo. Làm việc với SQL Server 2017
Adam Macierzyński

19

Trước tiên hãy thử đóng tất cả các kết nối với cơ sở dữ liệu của bạn:

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

Lấy từ đây


4

Điều này đã làm điều đó cho tôi:

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

Thay đổi cơ sở dữ liệu sang chế độ người dùng duy nhất như trong các câu trả lời khác

Đôi khi, ngay cả sau khi chuyển đổi sang chế độ người dùng, kết nối duy nhất được phép vào cơ sở dữ liệu có thể được sử dụng.

Để đóng kết nối ngay cả sau khi chuyển đổi sang chế độ người dùng, hãy thử:

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

Nhìn vào kết quả và xem ID của kết nối đến cơ sở dữ liệu được đề cập.

Sau đó sử dụng lệnh bên dưới để đóng kết nối này (chỉ nên có một vì cơ sở dữ liệu hiện đang ở chế độ người dùng)

GIẾT kết nối_ID

Thay thế Connection_id bằng ID trong kết quả của truy vấn đầu tiên


1

1.database đặt chế độ người dùng đơn thứ 1

THAY ĐỔI CƠ SỞ BOSEVIKRAM SINGLE_USER VỚI ROLLBACK NGAY LẬP TỨC

2. GIỚI THIỆU CƠ SỞ

ALTER DATABASE BOSEVIKRAM sửa đổi tên = [BOSEVIKRAM_Deleted]

3.DATABAE THIẾT LẬP MULIUSER

THAY ĐỔI CƠ SỞ BOSEVIKRAM_Delatted SET MULTI_USER VỚI ROLLBACK NGAY LẬP TỨC


0

Một cách khác để đóng tất cả các kết nối:

Công cụ quản trị> Xem Dịch vụ địa phương

Dừng / Bắt đầu dịch vụ "Máy chủ SQL (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

Đây là câu trả lời chính xác giống như Squid's
reggaeg Ức
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.