use master
go
if exists(select * from master.dbo.sysobjects where name = 'proc_kill_dbconnections' and type = 'P')
    drop procedure dbo.proc_kill_dbconnections
go
create procedure proc_kill_dbconnections
/*****************************************************************************************************
*
* Author Rafal Skotak
* Purpose Procedure tries to kill all connections to the specified database
*
* Date 2011.02.18
*
******************************************************************************************************/
    @dbname    sysname
with encryption
as
begin
    set nocount on
    ------- prepare temporary tables
    -------------------------------------------
    create table #temp_processes_table
    (
        spid             int primary key, 
        ecid             int,
        status             sysname, 
        loginame         sysname null, 
        hostname         sysname null, 
        blk             int, 
        dbname             sysname null, 
        cmd             sysname null,
        request_id        int null,
        mod             int not null default 0
    );
    -- get processes list
    --------------------------
    insert into #temp_processes_table (spid, ecid, status, loginame, hostname, blk, dbname, cmd, request_id) exec sp_who
    declare @count        int
    declare @process_id    int
    declare @cmd        varchar(8000)
    select @count = count(*) from #temp_processes_table where mod = 0
    while @count > 0
    begin
        set @process_id = NULL
        select top 1 @process_id = spid from #temp_processes_table where mod = 0 and dbname = @dbname
        if @process_id is NULL
            break
        print @process_id
        set @cmd = 'kill ' + cast(@process_id as varchar)
        exec (@cmd)
        update #temp_processes_table set mod = 1 where spid = @process_id
        select @count = count(*) from #temp_processes_table where mod = 0 and dbname = @dbname
    end
    -- cleanup - drop temporary tables
    ---------------------------------------
    drop table #temp_processes_table
end
go
-- example
-- exec dbo.proc_kill_dbconnections 'Northwind'
No comments:
Post a Comment