数据库还原时的一个存储过程

Only_You_forver 2009-09-10 11:13:22
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 GO

我只是知道:因为数据库还原时不能还有其它用户仍在对数据库保持操作所以需要用到这个存储过程,但不知道它的真实意义,希望有人解答下,并且跟我说下数据库备份还原的原理。
...全文
131 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuStanly 2009-09-12
  • 打赏
  • 举报
回复
已经有正解了,看能不能捡个漏。
楼主可以试试用查询分析器打开当前数据库,然后再从企业管理器里面进行还原操作看,就会发现提示错误,未能独占操作数据库。
myufo1234 2009-09-12
  • 打赏
  • 举报
回复
让你所要还原的数据库处于非活动~也就是常说的杀掉对其操作的进程
Only_You_forver 2009-09-12
  • 打赏
  • 举报
回复
虽然知道是那么回事,但还是看不懂它的意思
Only_You_forver 2009-09-12
  • 打赏
  • 举报
回复
解决了,谢谢大家,
嘿嘿
Only_You_forver 2009-09-12
  • 打赏
  • 举报
回复
我在还原的时候报异常说只允许单用户操作,但这个存储过程不就是解决这个问题的么?
但为什么还报这个错呢?
鸭梨山大帝 2009-09-11
  • 打赏
  • 举报
回复
看着头晕,重新排版下
这个SP的意义就是接收传入的 dbname 名,然后把该DB下所有活动的PIDProcess全部杀掉.
清除所有使用者


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
GO
wuyq11 2009-09-11
  • 打赏
  • 举报
回复
CREATE procedure RestoreDb @bkfile nvarchar(1000),@dbname sysname='',@dbpath nvarchar(260)='',@retype nvarchar(10)='DB',@filenumber int=1, @overexist bit=1,@killuser bit=1
as declare @sql varchar(8000) if isnull(@dbname,'')=''select @sql=reverse(@bkfile),@sql=case when charindex('.',@sql)=0 then @sql else substring(@sql,charindex('.',@sql)+1,1000) end ,@sql=case when charindex('\',@sql)=0 then @sql else left(@sql,charindex('\',@sql)-1) end,@dbname=reverse(@sql)
set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname+' from disk='''+@bkfile+''''+' with file='+cast(@filenumber as varchar) +case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end +case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end
print @sql
if @overexist=1 and @killuser=1
begin declare @spid varchar(20) declare #spid cursor for select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) open #spid fetch next from #spid into @spid while @@fetch_status=0 begin exec('kill '+@spid) fetch next from #spid into @spid End close #spid deallocate #spid End
exec (@sql)
GO
查询进程
kill 根据系统进程 ID (SPID) 终止用户进程
xueyou98 2009-09-11
  • 打赏
  • 举报
回复
楼上正解

作用:杀掉传入数据库中的活动进程以进行备份还原等独占操作

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧