Como você expulsa os usuários de um banco de dados do SQL Server 2008?


22

Precisamos fazer uma restauração e não podemos porque outros usuários estão conectados. Pensamos que havíamos desconectado todos os processos, mas aparentemente não.

Como podemos, no Management Studio, dar início a todos os outros para que possamos fazer esse backup?

Respostas:


25

Existem duas maneiras de fazer isso:

  1. Clique com o botão direito do mouse no banco de dados no Pesquisador de Objetos, vá para Tarefas> Desanexar. Marque a caixa de seleção Soltar conexões.

  2. Defina o banco de dados para o modo de usuário único, conforme descrito aqui :

    -- 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

Não sabia que eu tinha tantos comentários lol. Marian está correta, não há necessidade de executar o desanexamento real, basta obter o script para matar os usuários. @NickChammas Sim, fazê-lo apenas para leitura impede que os usuários se reconectem. Quando você o define como multiusuário, você pode fazer a restauração. Além disso, os nomes db são de um modelo e, como tal, as tags como '<Database Name, sysname>' devem ser substituídas pelo uso de Ctrl + Shift + M. Em um script não modelado, os dbnames não teriam aspas ao seu redor.
Wil

43

Eu sempre uso o seguinte:

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;

Às vezes isso pode demorar um pouco, e às vezes ele está bloqueado porque você é o único executá-lo, e você tem uma conexão ativa com o banco de dados . Verifique se há outras janelas de consulta que possam ter o mesmo contexto de banco de dados - isso pode incluir caixas de diálogo abertas, Object Explorer, IntelliSense, trabalhos de longa duração, etc.

Quando termino de fazer minhas alterações na configuração desse banco de dados, simplesmente:

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

Embora, às vezes, o que eu preciso fazer nesse banco de dados exija que o banco de dados esteja on-line, então às vezes eu tenho que deixá-lo no modo de usuário único e fazer o seguinte:

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

Agora eu posso fazer minhas alterações e, quando estiver pronto para a conexão de outros usuários, simplesmente:

ALTER DATABASE [dbname] SET MULTI_USER;

2

Normalmente, defino o banco de dados em single_user e, em seguida, aguardo o atraso e, em seguida, defino o banco de dados no multiusuário, conforme abaixo:

-- 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'

Na verdade, não é necessário "definir multiusuário", pois você está executando um único script (transação) com a instrução restore. A restauração com recuperação cuidará de colocar o banco de dados novamente no modo multiusuário.
precisa saber é o seguinte

1

Nenhuma das opções acima funcionou para mim porque o servidor foi atacado por várias tentativas de conexão remota.

Quando fechei a porta específica do banco de dados no firewall do Windows, o Alter .. Set Multi_User normal funcionou na primeira tentativa.


-1

Na verdade, o seguinte mata todas as conexões. Bastante útil nos casos em que a configuração do modo de usuário único falha

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
Isso não funciona porque sysprocessesnem sempre é responsável por todas as sessões que podem conter bloqueios nesse banco de dados (pense no cenário simples em que uma consulta é executada no contexto do banco de dados A, mas une uma tabela em A e uma tabela em B) .
Aaron Bertrand

-1

Você pode usar o script abaixo para destruir todos, ou modificar para um banco de dados específico.

Tudo o que puder ser morto, será! No entanto, os SPIDs do serviço SQL não serão afetados.

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

Eu uso este código:

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

Mas posso ver que o exemplo SINGLE USER é menos digitado.


3
A configuração do banco de dados online novamente significa que outros usuários podem se conectar novamente antes de iniciar a restauração.
Aaron Bertrand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.