賽迪網 > 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技術 ·開發·網管·安全·數據庫·作業系統
  資訊化 ·熱點·專題·訪談·週刊·方案案例
· 移動資訊化市場方興未艾 企業呼喚標準出臺
· 如何把握企業價值差異 避免CRM與SCM脫節
· 齊看四大廠商的SaaS動態 ERP案例分析
· 通方期貨CRM解決方案 方正電子公文系統
  IT博客 ·曾劍秋·項立剛·Java學習·網管
  IT技術論壇 ·開發·網管·安全·數據庫·系統