我需要帮助设置在SINGLE_USER模式恢复到MULTI_USER的数据库。每次我奔跑

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

我得到这个错误:

目前不能更改数据库'BARDABARD'的状态或选项。 数据库处于单用户模式,当前有用户连接到数据库。

它需要在非SINGLE_USER模式下将其设置为另一种模式,但当它是SINGLE_USER模式时,我不能将数据库设置为任何其他模式。


当前回答

工作内容:

首先,我杀死所有数据库进程,以证明数据库没有在使用。 在我改变用户模式之后。

有时,一个进程会很快从应用程序中再次获取,我需要再次运行这个进程……

替换下面的表达式DATABASE_NAME,以使用您的数据库名称。

——杀过程

USE Master 
GO

declare @sql as varchar(20), @spid as int

select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('DATABASE_NAME')  and spid != @@spid    

while (@spid is not null) 
begin
    print 'Killing process ' + cast(@spid as varchar) + ' ...'
    set @sql = 'kill ' + cast(@spid as varchar)
    exec (@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        spid > 50 AND dbid = db_id('DATABASE_NAME') 
        and spid != @@spid 
end 

print 'Killing Process completed...' 
GO

**--Alter user mode** 

ALTER DATABASE DATABASE_NAME SET MULTI_USER; 

GO 

print 'Alter Database Process completed...'

其他回答

SQL Server 2012:

右键单击DB > Properties > Options >[向下滚动]State > RestrictAccess >选择Multi_user,然后单击OK。

拖鞋!

我轻而易举地解决了这个问题

右键单击数据库名称,重命名它 更改后,右键单击数据库名称—>属性—>选项—>滚动限制性访问底部(SINGLE_USER到MULTI_USER) 现在,您可以再次将数据库重命名为您的旧名称。

这对我来说很有效。

步骤1。右键单击数据库引擎,单击活动监视器,查看哪个进程正在连接。立即终止特定用户并执行查询。

步骤2。

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

并刷新数据库。

我实际上有一个问题,我的db几乎被进程和竞争条件锁定,当我得到一个命令执行刷新时,他们再次锁定…我不得不在SSMS中背靠背地运行以下命令,让我离线,从那里我做了我的恢复,并恢复在线,这两个查询在哪里:

第一个跑:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

然后紧接着(在第二个查询窗口中):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

做了我需要做的,然后重新上线。感谢所有为我写这些文章的人,让我把这些文章结合起来,解决我的问题。

工作内容:

首先,我杀死所有数据库进程,以证明数据库没有在使用。 在我改变用户模式之后。

有时,一个进程会很快从应用程序中再次获取,我需要再次运行这个进程……

替换下面的表达式DATABASE_NAME,以使用您的数据库名称。

——杀过程

USE Master 
GO

declare @sql as varchar(20), @spid as int

select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('DATABASE_NAME')  and spid != @@spid    

while (@spid is not null) 
begin
    print 'Killing process ' + cast(@spid as varchar) + ' ...'
    set @sql = 'kill ' + cast(@spid as varchar)
    exec (@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        spid > 50 AND dbid = db_id('DATABASE_NAME') 
        and spid != @@spid 
end 

print 'Killing Process completed...' 
GO

**--Alter user mode** 

ALTER DATABASE DATABASE_NAME SET MULTI_USER; 

GO 

print 'Alter Database Process completed...'