信息产业培训网
[当前位置]:首页--技术专区--数据库--OracleRSS订阅按钮

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

http://www.miiceic.org.cn   2008-7-17 13:10:08   中程在线   浏览数:
关键字:T-SQL 强制 退出 数据库

 

  目的:强制所有用户退出当前服务器

 

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

来源:CCID
相关连接
最新评论
*以下网友发言不代表中程在线网站的观点和看法
    我要评论

    请您注意
    1、遵守中华人民共和国的各项有关法律规定
    2、承担一切因您的行为而导致的法律责任
    3、本网留言管理人员有权删除其管辖留言内容
    4、您在本网的留言本网有权在网站内转载和引用
    5、参与本留言即表明您已经阅读并接受上述条款
    我爱研发网希赛网软件测试网中电华信太平洋电脑网天空网
    电脑爱好者泡泡网华军软件霏凡软件站软件开发网腾讯网
    eNet下载汉化新世纪小熊在线BIOS之家数动连线....[更多]
    关于我们 | 网站地图 | 周边住宿 | 行车路线 | 联系我们 | 网站律师 | 意见反馈 | 虚位以待 | 友情链接
    中程在线(北京)科技有限公司 版权所有
    总 部:北京市海淀区青东商务楼A座西四层
    企业培训部:010-52636110 52636106 就业培训部:010-68716925 68716926
    邮 件:training@miiceic.org.cn
    京ICP备06053134号
    Copyright © 2005-2008 Miiceic.org.cn All Rights Reserved