-- ===在进行数据库还原时,需要保证待还原数据库是静态的,即当前不能有任何用户(进程)连接此数据库,
-- ===为了保证待还原数据库处于静态状态,可以使用一定的方法杀死当前正连接此数据库的所有用户(进程)即可。
-- ===下面提供了“杀死连接待还原数据库的所有进程”的一种很好的解决方案
use master
go
-- ===================Create the Procedure==============================
if exists (select * from master.dbo.sysobjects where name = 'killProc' and xtype = 'p')
DROP PROCEDURE killproc
go
create procedure killProc -- 创建(用于杀死连接待还原数据库的所有进程的)存储过程
@dbname varchar ( 20) -- 定义一个变量 nvarchar类型 @dbname,指定要杀死的是哪个数据库的进程
as
--++++以下是存储过程体++++--
declare @sql nvarchar ( 500)
declare @spid int -- SPID 值是当用户进行连接时指派给该连接的一个唯一的整数
set @sql = 'declare getspid cursor for select spid from sysprocesses where dbid=db_id(''' + @dbname + ''')'
-- 给变量@sql赋值
exec ( @sql ) -- 执行语句@sql,给游标赋值
open getspid -- 打开游标
fetch next from getspid into @spid -- fetch next是紧跟当前行返回结果行,并且当前行递增为返回行。
-- 如果 FETCH NEXT 是对游标的第一次提取操作,则返回结果集中的第一行。此处应该是将游标的值一个个的赋予@spid。
while @@fetch_status <> -1 -- 如果 FETCH 语句没有执行失败或此行不在结果集中。
begin
exec ( 'kill ' + @spid ) -- 终止正常连接,杀死使用ID为@spid的数据库的进程。
fetch next from getspid into @spid
end
close getspid -- 关闭游标
deallocate getspid -- 删除游标
--+++++以上是存储过程体++++--
go
-- ===================Execute the Procedure==============================
EXECUTE killproc 'czdb' -- 杀死连接数据库czdb的所有进程