IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('dbo.isAdminUsingDB') AND sysstat & 0xf = 4) DROP PROCEDURE dbo.isAdminUsingDB GO CREATE PROCEDURE isAdminUsingDB @dbName VARCHAR(30), @source VARCHAR(30) AS DECLARE @dbSyncTask VARCHAR(50), @logSyncTask VARCHAR(50), @maintTask VARCHAR(50), @val int /* Procedure isAdminUsingDB checks to see if any spids except the spid this procedure is executing on are using the same database as this spid. It returns the number of other spids in the database. Naming conventions in systasks are important here! Modify the *Task variables to match your naming convention in systasks. Check for both T-SQL and CmdExec task types */ SET NOCOUNT ON SELECT @myName = 'admin.isAdminUsingDB' SELECT @dbSyncTask = "dbSync " + @dbName + "%" SELECT @logSyncTask = "logSync " + @dbName + "%" SELECT @maintTask = "Maintain " + @dbName + "%" SELECT @val = (SELECT count(*) FROM master..sysprocesses WHERE spid <> @@SPID AND program_name LIKE ("SQLEXEC - TSQL Task #%") AND CONVERT(INT,SUBSTRING(RTRIM(program_name), CHARINDEX("#", program_name) + 1, DATALENGTH(program_name) - CHARINDEX("#", program_name))) IN (SELECT id FROM msdb..systasks WHERE ( name LIKE (@dbSyncTask) AND ( CHARINDEX(@source, name) > 0 OR CHARINDEX(@target, name) > 0)) OR ( name LIKE (@logSyncTask) AND ( CHARINDEX(@source, name) > 0 OR CHARINDEX(@target, name) > 0)) OR name LIKE (@maintTask))) IF (@val = 0) BEGIN /* still could be a CMDEXEC competitor */ IF (SELECT count(*) FROM master..sysprocesses WHERE program_name = ("ISQL-32") AND spid <> @@SPID) <> 0 BEGIN /* temp table needs to allow nulls in case a spid that qualified for the cursor ends before the count*/ CREATE TABLE #string(name VARCHAR(255) NULL) DECLARE CmdExec_cursor CURSOR FOR SELECT spid FROM master..sysprocesses WHERE program_name = "ISQL-32" AND spid <> @@SPID OPEN CmdExec_cursor FETCH NEXT FROM CmdExec_cursor INTO @spid WHILE (@@fetch_status <> -1) BEGIN SELECT @CMD = "DBCC INPUTBUFFER(" + CONVERT(VARCHAR(6), @spid) + ")" INSERT #string EXEC(@CMD) FETCH NEXT FROM CmdExec_cursor INTO @spid END CLOSE CmdExec_cursor DEALLOCATE CmdExec_cursor SELECT @val = (SELECT count(*) FROM #string WHERE ( name LIKE (@dbSyncTask) AND ( CHARINDEX(@source, name) > 0 OR CHARINDEX(@target, name) > 0)) OR ( name LIKE (@logSyncTask) AND ( CHARINDEX(@source, name) > 0 OR CHARINDEX(@target, name) > 0)) OR name LIKE (@maintTask)) DROP TABLE #string END END IF @debug = 'true' BEGIN SELECT "stored procedure ",@myName SELECT "number of competing processes = ", @val END RETURN @val GO