Làm thế nào để bạn loại người dùng ra khỏi cơ sở dữ liệu SQL Server 2008?


22

Chúng tôi cần thực hiện khôi phục và không thể vì những người dùng khác được kết nối. Chúng tôi nghĩ rằng chúng tôi đã ngắt kết nối mọi quy trình, nhưng dường như không.

Làm thế nào chúng ta có thể, từ Management Studio, khởi động mọi người khác để chúng ta có thể thực hiện sao lưu này?

Câu trả lời:


25

Có hai cách để làm điều đó:

  1. Nhấp chuột phải vào cơ sở dữ liệu trong Object Explorer, đi đến Nhiệm vụ> Tách. Chọn hộp kiểm Thả kết nối.

  2. Đặt cơ sở dữ liệu về chế độ một người dùng như được nêu ở đây :

    -- hit Ctrl+Shift+M in SSMS to fill in the template parameter
    USE master;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET SINGLE_USER
    WITH ROLLBACK IMMEDIATE;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET READ_ONLY;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET MULTI_USER;
    GO
    

Không nhận ra tôi đã có rất nhiều bình luận lol. Marian là chính xác, không cần phải chạy tách ra thực tế, chỉ cần lấy kịch bản để giết người dùng. @NickChammas Vâng, làm cho nó đọc chỉ ngăn người dùng kết nối lại. Khi bạn đặt nó nhiều người dùng, bạn có thể thực hiện khôi phục. Ngoài ra, tên db là từ một mẫu và các thẻ như '<Tên cơ sở dữ liệu, sysname>' được dự định thay thế thông qua việc sử dụng Ctrl + Shift + M. Trong một tập lệnh không được tạo khuôn mẫu, các dbnames sẽ không có dấu ngoặc kép xung quanh chúng.
Wil

43

Tôi luôn luôn sử dụng như sau:

USE master; -- get out of dbname myself
GO
-- kick all other users out:
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- prevent sessions from re-establishing connection:
ALTER DATABASE [dbname] SET OFFLINE;

Đôi khi điều này có thể mất một lúc và đôi khi nó bị chặn vì bạn là người đang chạy nó và bạn có kết nối hoạt động với cơ sở dữ liệu . Kiểm tra các cửa sổ truy vấn khác có thể có cùng bối cảnh cơ sở dữ liệu - điều này có thể bao gồm các hộp thoại mở, Object Explorer, IntelliSense, các công việc dài hạn, v.v.

Khi tôi thực hiện xong các thay đổi đối với cấu hình của cơ sở dữ liệu đó, tôi chỉ cần:

ALTER DATABASE [dbname] SET ONLINE;
ALTER DATABASE [dbname] SET MULTI_USER;

Mặc dù, đôi khi, điều tôi cần làm với cơ sở dữ liệu đó yêu cầu cơ sở dữ liệu phải trực tuyến, vì vậy đôi khi tôi phải để nó ở chế độ một người dùng và thực hiện việc này:

ALTER DATABASE [dbname] SET ONLINE;
GO
USE [dbname];

Bây giờ tôi có thể thực hiện các thay đổi của mình và sau đó khi tôi sẵn sàng cho người dùng khác kết nối, chỉ cần:

ALTER DATABASE [dbname] SET MULTI_USER;

2

Tôi thường đặt cơ sở dữ liệu trong single_user và sau đó chờ trì hoãn và sau đó đặt lại cơ sở dữ liệu trong nhiều người dùng như sau:

-- to kill all connections for particular db ... otherwise the restore will fail as exclusive lock cannot be obtained for the db being restored.

    alter database db_name
    set single_user with rollback immediate
    waitfor delay '00:00:05'  -- wait for 5 secs
    alter database db_name
    set multi_user
    restore database db_name from disk = 'D:\restore\db_name.bak'
    with replace, stats = 10, recovery -- if you want to recover your database online
    -- optional if you dont have the same directory/file structure
    move 'datafile logical name' to 'E:\data\physical_name.mdf',
    move 'logfile logical name' to 'F:\log\physical_name_log.ldf'

Trên thực tế, không cần thiết phải "thiết lập multi_user", vì bạn đang chạy một tập lệnh (giao dịch) với câu lệnh khôi phục. Việc khôi phục với khôi phục sẽ đảm nhiệm việc đưa cơ sở dữ liệu trở lại chế độ nhiều người dùng.
Svein Terje Gaup

1

Không có tùy chọn nào ở trên hoạt động với tôi vì máy chủ bị cản trở bởi nhiều lần thử kết nối từ xa.

Khi tôi đóng cổng cơ sở dữ liệu cụ thể trên tường lửa windows, Alter bình thường .. Đặt Multi_User hoạt động trong lần thử đầu tiên.


-1

Sau đây thực sự giết chết tất cả các kết nối. Khá hữu ích trong trường hợp cài đặt chế độ người dùng đơn không thành công

declare @execSql varchar(1000), @databaseName varchar(100)
-- Set the database name for which to kill the connections
set @databaseName = 'databasename'
set @execSql = '' 
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from    master.dbo.sysprocesses
where   db_name(dbid) = @databaseName
     and
     DBID <> 0
     and
     spid <> @@spid
exec(@execSql)

1
Điều này không hoạt động vì sysprocesseskhông phải lúc nào cũng tính đến tất cả các phiên có thể giữ khóa trong cơ sở dữ liệu đó (hãy nghĩ về kịch bản đơn giản khi truy vấn được chạy trong ngữ cảnh của cơ sở dữ liệu A nhưng tham gia một bảng trong A và một bảng trong B) .
Aaron Bertrand

-1

Bạn có thể sử dụng tập lệnh bên dưới để nuke mọi người hoặc sửa đổi cho một DB cụ thể.

Bất cứ điều gì có thể bị giết chết, sẽ được! SPID dịch vụ SQL tuy nhiên sẽ không bị ảnh hưởng.

Drop table #who

go 

Create table #who(  [spid] int,
                    [ECID] int,
                    [Status] varchar(100),
                    [Loginname] varchar(200),
                    [Hostname] varchar(200),
                    [blk] bit,
                    dbname varchar(200),
                    cmd varchar(1000),
                    requestID int
                  )

go

Insert into #who (Spid, ECID, Status, Loginname, hostname,blk, dbname, cmd, requestid)
exec sp_who

Declare cursKillUsers Cursor for Select 'Kill ' + cast(spid as varchar(100)) + ';' [SQL] from #who where dbname like '%'
Declare @sql varchar(200)
Open cursKillUsers
Fetch next from cursKillUsers into @sql
While @@fetch_status = 0 
begin

    print @sql
    Exec (@sql)
    Fetch next from cursKillUsers into @sql

end

close cursKillUsers
deallocate cursKillUsers

-3

Tôi sử dụng mã này:

ALTER DATABASE [Dbname] set offline with rollback immediate
GO
ALTER DATABASE [Dbname] set online
GO

Nhưng tôi có thể thấy ví dụ SINGLE USER ít nhập hơn.


3
Ngoài ra, thiết lập cơ sở dữ liệu trực tuyến có nghĩa là người dùng khác có thể kết nối lại trước khi bạn bắt đầu khôi phục.
Aaron Bertrand
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.