在用Asp.net对备份的数据库文件进行还原的时候,有时候会出现下面的错误异常:
[因为数据库正在使用,所以未能获得对数据库的排它访问权。 RESTORE DATABASE 操作异常终止。已将数据库上下文改为 'master'。]
这个时候,自由等待其他进程释放对应权限后,才可还原成功!有没有解决办法呢?我参照【Java】对这个问题的解决方法,做了更新,问题解决。
[SQL代码]
--
还原数据库时数据库正在使用导致数据库无会还原,此存储过存在msater数据库下创建。exec killspid 'dbname' 结束此数据库的进程,这样才能还原数据库
create proc killspid ( @dbname varchar ( 20 ))
as
begin
declare @sql nvarchar ( 500 )
declare @spid int
set @sql = ' declare getspid cursor for select spid from sysprocesses where dbid=db_id( ''' + @dbname + ''' ) '
exec ( @sql )
open getspid
fetch next from getspid into @spid
while @@fetch_status <> - 1
begin
exec ( ' kill ' + @spid )
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
create proc killspid ( @dbname varchar ( 20 ))
as
begin
declare @sql nvarchar ( 500 )
declare @spid int
set @sql = ' declare getspid cursor for select spid from sysprocesses where dbid=db_id( ''' + @dbname + ''' ) '
exec ( @sql )
open getspid
fetch next from getspid into @spid
while @@fetch_status <> - 1
begin
exec ( ' kill ' + @spid )
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
[C#代码]
///
<
summary
>
///
恢复数据库,可选择是否可以强制还原(即在其他人在用的时候,依然可以还原)
///
</
summary
>
///
<
param name
=
"databasename"
>
待还原的数据库名称
</
param
>
///
<
param name
=
"databasefile"
>
带还原的备份文件的完全路径
</
param
>
///
<
param name
=
"errormessage"
>
恢复数据库失败的信息
</
param
>
///
<
param name
=
"forceRestore"
>
是否强制还原(恢复),如果为TRUE,则exec killspid
'
数据库名
'
结束此数据库的进程,这样才能还原数据库
</
param
>
///
<
returns
></
returns
>
public
bool RestoreDataBase(string databasename, string databasefile, ref string errormessage,bool forceRestore)
{
bool success
=
true;
string path
=
databasefile;
string dbname
=
databasename;
string restoreSql
=
"
use
master;";
if
(forceRestore)
//
如果强制回复
restoreSql
+=
string.Format("
use
master
exec
killspid
'
{0}
'
;",databasename);
restoreSql
+=
"
restore
database
@dbname
from
disk
=
@path
;";
SqlCommand myCommand
=
new SqlCommand(restoreSql, conn);
myCommand.Parameters.
Add
("
@dbname
", SqlDbType.
Char
);
myCommand.Parameters
[
"@dbname"
]
.Value
=
dbname;
myCommand.Parameters.
Add
("
@path
", SqlDbType.
Char
);
myCommand.Parameters
[
"@path"
]
.Value
=
path;
try
{
myCommand.Connection.
Open
();
myCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
errormessage
=
ex.Message;
success
=
false;
}
finally
{
myCommand.Connection.
Close
();
}
return
success;
}

本文介绍了一种在ASP.NET中解决数据库还原时遇到的“未能获得排它访问权”问题的方法。通过创建存储过程killspid来结束目标数据库的所有进程,从而实现强制还原。此外,还提供了一个C#示例,展示了如何在代码中调用此存储过程。
1799

被折叠的 条评论
为什么被折叠?



