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我只是知道:因为数据库还原时不能还有其它用户仍在对数据库保持操作所以需要用到这个存储过程,但不知道它的真实意义,希望有人解答下,并且跟我说下数据库备份还原的原理。

解决方案 »

  1.   

    看着头晕,重新排版下
    这个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 
      

  2.   

    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) 终止用户进程