Bagaimana Anda mengeluarkan pengguna dari database SQL Server 2008?

22

Kami perlu melakukan pemulihan, dan tidak bisa karena pengguna lain terhubung. Kami pikir kami telah memutus setiap proses, tetapi ternyata tidak.

Bagaimana kita, dari Management Studio, memulai orang lain sehingga kita dapat melakukan backup ini?

Daniel Williams
sumber

Jawaban:

25

Ada dua cara untuk melakukannya:

  1. Klik kanan pada database di Object Explorer pergi ke Tugas> Lepaskan. Pilih kotak centang Jatuhkan Koneksi.

  2. Setel basis data ke mode satu-pengguna seperti diuraikan di sini :

    -- 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
Wil
sumber
Tidak sadar saya punya banyak komentar lol. Marian benar, tidak perlu menjalankan detas yang sebenarnya, cukup dapatkan skrip untuk membunuh pengguna. @NickChammas Ya, membuatnya hanya membaca mencegah pengguna untuk terhubung kembali. Ketika Anda mengaturnya multi-pengguna Anda dapat melakukan restore. Juga nama db berasal dari templat, dan dengan demikian tag seperti '<Database Name, sysname>' dimaksudkan untuk diganti melalui penggunaan Ctrl + Shift + M. Dalam skrip yang tidak templated, nama-nama db tidak memiliki tanda kutip di sekitarnya.
Wil
43

Saya selalu menggunakan yang berikut ini:

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;

Kadang-kadang ini membutuhkan waktu, dan kadang-kadang diblokir karena kaulah yang menjalankannya, dan Anda memiliki koneksi aktif ke database . Periksa jendela kueri lain yang mungkin memiliki konteks database yang sama - ini dapat mencakup dialog terbuka, Object Explorer, IntelliSense, pekerjaan yang sudah berjalan lama, dll.

Ketika saya selesai melakukan perubahan pada konfigurasi database itu, saya hanya:

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

Meskipun, kadang-kadang, hal yang perlu saya lakukan untuk database itu mengharuskan database untuk online, jadi kadang-kadang saya harus meninggalkannya dalam mode pengguna tunggal dan melakukan ini:

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

Sekarang saya bisa melakukan perubahan, dan kemudian ketika saya siap bagi pengguna lain untuk terhubung, cukup:

ALTER DATABASE [dbname] SET MULTI_USER;
Aaron Bertrand
sumber
2

Saya biasanya mengatur database di single_user dan kemudian menunggu untuk menunda dan kemudian mengatur kembali database di multiuser seperti di bawah ini:

-- 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'
Kin Shah
sumber
Sebenarnya, tidak diperlukan untuk "mengatur multi_user", karena Anda menjalankan skrip tunggal (transaksi) dengan pernyataan pemulihan. Pemulihan dengan pemulihan akan membantu mengembalikan database ke mode multi-pengguna.
Svein Terje Gaup
1

Tidak ada opsi di atas yang berfungsi untuk saya karena server dihantam oleh beberapa upaya koneksi jarak jauh.

Ketika saya menutup port database spesifik pada windows firewall, Alter normal .. Set Multi_User bekerja dalam upaya pertama.

olafk
sumber
-1

Yang berikut ini benar-benar membunuh semua koneksi. Cukup berguna dalam kasus di mana pengaturan mode pengguna tunggal gagal

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)
Betty
sumber
1
Ini tidak berfungsi karena sysprocessestidak selalu memperhitungkan semua sesi yang mungkin memegang kunci dalam basis data tersebut (pikirkan skenario sederhana di mana kueri dijalankan dalam konteks basis data A tetapi bergabung dengan tabel dalam A dan tabel di B) .
Aaron Bertrand
-1

Anda dapat menggunakan skrip di bawah ini untuk mem-nuke semua orang, atau memodifikasi untuk DB tertentu.

Apa pun yang bisa dibunuh, akan! Namun, SPID layanan SQL tidak akan terpengaruh.

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
BITSYSUK
sumber
-3

Saya menggunakan kode ini:

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

Tapi saya bisa melihat contoh SINGLE USER kurang mengetik.

Paul Els
sumber
3
Juga mengatur database kembali online berarti pengguna lain dapat terhubung lagi sebelum Anda memulai pemulihan Anda.
Aaron Bertrand