Thursday, October 11, 2007

Stored Procedure to gain exclusive access to a database

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USP_GETEXCLUSIVE]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[USP_GETEXCLUSIVE]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



--create stored procedure
CREATE PROCEDURE USP_GETEXCLUSIVE @dbname varchar(100) AS
SET NOCOUNT ON
SET QUOTED_IDENTIFIER OFF

--declares our variables
DECLARE @KILL_ID int
DECLARE @QUERY VARCHAR(320)

DECLARE GETEXCLUSIVE_CURSOR CURSOR FOR

--get all SPIDs from SYSOBJECTS table which match our database
SELECT A.SPID FROM SYSPROCESSES A JOIN
SYSDATABASES B ON A.DBID=B.DBID WHERE B.NAME=@DBNAME

OPEN GETEXCLUSIVE_CURSOR
FETCH NEXT FROM GETEXCLUSIVE_CURSOR INTO @KILL_ID

WHILE(@@FETCH_STATUS =0)
BEGIN

--form drop trigger query
SET @QUERY = 'KILL '+ CONVERT(VARCHAR,@KILL_ID)

EXEC (@QUERY)
FETCH NEXT FROM GETEXCLUSIVE_CURSOR INTO @KILL_ID
END

CLOSE GETEXCLUSIVE_CURSOR
DEALLOCATE GETEXCLUSIVE_CURSOR

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO