|
Ô´´úÂëÍøÍÆ¼ö
Ä¿µÄ:Ç¿ÖÆËùÓÐÓû§Í˳öµ±Ç°·þÎñÆ÷¡£
ÃèÊö:¸Ã´úÂëÖÕÖ¹Êý¾Ý¿âµÄËùÓÐÓû§½ø³Ì. Óû§½ø³ÌÊÇ sp_who, »òÕß sp_who2, SPID > 50 ·µ»ØµÄËùÓнø³Ì. ´úÂëʹÓà sp_who (²»Ç£³¶ÈκÎϵͳ±í)²éÕÒÔËÐÐÔÚµ±Ç°Êý¾Ý¿âÉϵĽø³Ì, ²¢Í¨¹ýʹÓà KILL <½ø³ÌºÅ> ÖÕÖ¹½ø³Ì..
Óû§¿ÉÒÔÖ¸¶¨ @MaxAttemptsToKillEachUserProcess ±äÁ¿(³¢ÊÔÖÕÖ¹µ¥¸ö½ø³ÌµÄ´ÎÊý, ĬÈÏÖµ 3). Èç¹û³¬¹ý×î´óÖµ, ´úÂ뽫·µ»ØÒ»¸ö´íÎó (ÀýÈç, ½ø³Ì²»Äܱ»ÖÕÖ¹).
½á¹û¼¯: NA
½á¹û¼¯ÅÅÐò: NA
ʹÓÃµÄ TABLES/VIEWS: NA REVISIONS DATE DEVELOPER DESCRIPTION OF REVISION VERSION ================================================================ 05/05/2005 Omri Bahat Initial release 1.00 ================================================================ Copyright ?SQL Farms Solutions, www.sqlfarms.com. All rights reserved. This code may be used at no charge as long as this copyright notice is not removed. ===============================================================*/ DECLARE @MaxAttemptsToKillEachUserProcess INT DECLARE @CurrentAttempts INT DECLARE @ServerName NVARCHAR(128) DECLARE @DatabaseName NVARCHAR(128) DECLARE @SQLCommand NVARCHAR(128) DECLARE @SPID INT DECLARE @LoginName NVARCHAR(128) SET NOCOUNT ON SET @MaxAttemptsToKillEachUserProcess = 3 -- µÃµ½·þÎñÆ÷ºÍÊý¾Ý¿âÃû³Æ SET @ServerName = CAST(ISNULL(SERVERPROPERTY("ServerName"), "Unknown") AS SYSNAME) -- ¸Ã±í¼Ç¼Óû§½ø³Ì±êʶ. IF OBJECT_ID("tempdb..#tblUserProcesses", "U") IS NOT NULL DROP TABLE #tblUserProcesses CREATE TABLE #tblUserProcesses ( SPID INT, ECID INT, Status NVARCHAR(256), LoginName NVARCHAR(128), HostName NVARCHAR(128), BlockedBy NVARCHAR(128), DatabaseName NVARCHAR(128), Command NVARCHAR(256)) INSERT INTO #tblUserProcesses EXEC SP_WHO DELETE FROM #tblUserProcesses WHERE SPID <= 50 OR SPID = @@SPID WHILE EXISTS(SELECT * FROM #tblUserProcesses WITH (NOLOCK)) BEGIN SET @SQLCommand = NULL SET @SPID = NULL SET @LoginName = NULL SET @DatabaseName = NULL SELECT TOP 1 @SQLCommand = "KILL " + CAST(SPID AS NVARCHAR(32)), @SPID = SPID, @LoginName = ISNULL(LoginName, "NA"), @DatabaseName = DatabaseName FROM #tblUserProcesses WITH (NOLOCK) SET @CurrentAttempts = 0 WHILE @CurrentAttempts <= @MaxAttemptsToKillEachUserProcess BEGIN EXEC(@SQLCommand) IF @@ERROR <> 0 BEGIN PRINT(N"Error killing process " + CAST(@SPID AS VARCHAR(32)) + N", of login " + @LoginName + N", on database " + @DatabaseName + N". The process was probably terminated by the user.") BREAK END -- Çå³ý±ØÒªµÄ±í WAITFOR DELAY "00:00:03" -- È·ÈϽø³ÌÕæÕýÖÕÖ¹ INSERT INTO #tblUserProcesses EXEC SP_WHO @SPID IF @@ROWCOUNT = 0 BREAK ELSE SET @CurrentAttempts = @CurrentAttempts + 1 END IF @CurrentAttempts > @MaxAttemptsToKillEachUserProcess BEGIN PRINT(N"The number of attempts to kill process " + CAST(@SPID AS VARCHAR(32)) + N", of login " + @LoginName + N", on database " + @DatabaseName + N" exceeded the maximum number of retry attempts. Script is aborting.") RETURN END DELETE FROM #tblUserProcesses INSERT INTO #tblUserProcesses EXEC SP_WHO DELETE FROM #tblUserProcesses WHERE SPID <= 50 OR SPID = @@SPID END GO
Ô´´úÂëÍø¹©¸å. |