| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
目的:强制所有用户退出当前服务器。 网管联盟bitsCN@com
描述:该代码终止数据库的所有用户进程. 用户进程是 sp_who, 或者 sp_who2, SPID > 50 返回的所有进程. 代码使用 sp_who (不牵扯任何系统表)查找运行在当前数据库上的进程, 并通过使用 KILL <进程号> 终止进程.. 网管网www_bitscn_com
用户可以指定 @MaxAttemptsToKillEachUserProcess 变量(尝试终止单个进程的次数, 默认值 3). 如果超过最大值, 代码将返回一个错误 (例如, 进程不能被终止).
网管朋友网www_bitscn_net
结果集: NA
结果集排序: NA 网管朋友网www_bitscn_net
使用的 TABLES/VIEWS: NA
|
REVISIONS 网管u家www.bitscn.net 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 中国网管联盟bitsCN.com 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)) 中国网管联盟bitsCN.com 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) 网管网www.bitscn.com 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 网管朋友网www_bitscn_net 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 网管u家u.bitsCN.com WHERE SPID <= 50 OR SPID = @@SPID END GO 网管联盟bitsCN@com |
网管网www_bitscn_com
|
0
|
评论加载中…