SQL Server数据库还原:"因为数据库正在使用,所以无法获得对数据库的独占访问权"

如题,网上找了一些客套的方法,如果不想去折腾,请看我的方法:

1、先脱机数据库,这个目的就是为了停掉所有链接

2、选择还原数据库,如果提示日志尾部不完整,请选择数据库属性的选项,覆盖现有数据。

还可以尝试以下方法:

一、SQL Server数据库备份还原后,在数据库名称后会出现“受限制访问”字样。

解决办法:

右键点击数据库->【属性】->【选项】->【状态】->【限制访问】->选择【Multiple】->【确定】

二、在对SQL Server数据库进行还原时,提示:System.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权。(Microsoft.SqlServer.Smo)。出现此问题的原因是在还原数据库时,有其他用户正在使用数据库。还原数据库要求数据库工作在单用户模式。通常就是DBA在操作时,不允许其他用户连接数据库。

解决办法:

方法一(最方便):右键点击数据库->【属性】->【选项】->【状态】->【限制访问】->选择【Single...】->【确定】。然后还原。(十有八九这个方法是行不通的,如有有很多人连接着,设置后就省下最后一个,那么可能那个人不是你,你还是无法还原)

方法二(最直接):断开数据库连接。

方法三(最暴力):注销/重启数据库服务器。(也可能行不通,如果重启后,你的操作不够快,最后还是给别人先连上了)

方法四(最麻烦):写代码修改数据库相关属性,虽然麻烦,有的时候还是要用到,那就用到的时候再研究。

1、先切换数据库到master数据库。执行语句:

select * from master..sysprocesses where dbid=db_id( '数据库名称')

2、然后逐步运行语句 

exec('kill 64')

其中64为上面的spid

方法四点一(最麻烦的第二种选择):还是写代码,一个全自动脚本:

declare @dbname varchar(50)
set @dbname='数据库名称'
declare @sql varchar(50)
declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses where db_name(dbid)=@dbname 
open cs_result
fetch next from cs_result into @sql
while @@fetch_status=0
begin
    execute(@sql)
    fetch next from cs_result into @sql
end
close cs_result
deallocate cs_result

方法四点二:(这个方法没试过)利用SQL语句,断开所有用户链接,并回滚所有事务,具体SQL语句如下:

alter database [数据库名称] 
set OFFLINE with rollback IMMEDIATE

注意:以上操作全部在master数据库上操作。

原文地址:https://www.cnblogs.com/EasonJim/p/4756844.html