µ±Ç°Î»ÖãºÊ×Ò³ > ÍøÂç±à³Ì > Êý¾Ý¿â > Oracle > ÓÃT-SQLÇ¿ÖÆËùÓÐÓû§Í˳öµ±Ç°Êý¾Ý¿â

ÓÃT-SQLÇ¿ÖÆËùÓÐÓû§Í˳öµ±Ç°Êý¾Ý¿â

µã»÷´ÎÊý£º30 ´Î ·¢²¼ÈÕÆÚ£º2008-11-22 16:35:34 ×÷ÕߣºÔ´´úÂëÍø
Ô´´úÂëÍøÍÆ¼ö

 Ä¿µÄ:Ç¿ÖÆËùÓÐÓû§Í˳öµ±Ç°·þÎñÆ÷¡£

        ÃèÊö:¸Ã´úÂëÖÕÖ¹Êý¾Ý¿âµÄËùÓÐÓû§½ø³Ì. Óû§½ø³ÌÊÇ 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

Ô´´úÂëÍø¹©¸å.
ÍøÓÑÆÀÂÛ (0)
»áÔ±ÖÐÐÄ
ÍøÂç±à³Ì
±¾Õ¾ÍƼö
ÍøÂç±à³ÌÖ®¾«»ª