赛迪网 > IT技术 数据库 > 精彩更新
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

使用T-SQL强制所有用户退出当前数据库

发布时间:2008.07.17 04:42     来源:赛迪网    作者:海勒

B<>【赛迪网-IT技术报道】目的:强制所有用户退出当前服务器。

描述:该代码终止数据库的所有用户进程. 用户进程是 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

(责任编辑:卢兆林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 带你深入了解"T-SQL"的十一种设计模式 (06-24) · 带你深入了解"T-SQL"的十一种设计模式 (06-24)
· 在T-SQL实现Oracle的MINUS集合运算符 (12-25) · 数据库应用程序常见T-SQL和PL/SQL (12-11)
· Oracle中如何用T-SQL语句建立跟踪 (11-15) · 求日期所属星座的T-SQL UDF(用户自定义) (09-20)
· SQL Server 管理常用的SQL和T-SQL (09-12) · 数据库知识:如何用T-SQL语句建立跟踪 (09-12)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 北京新规不能霸王硬上弓 网店牌照缓期执行
· 软件外包之变的新台阶: 提高全球交付能力
· ERP案例分析 SaaS带来冲击 IT服务商面临挑战
· 通方期货CRM解决方案 房地产行业CRM解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统