首页  登陆  注册  博客集  下载频道  网络硬盘  学院论坛  家园
IT学院 网站地图 网站地图
收藏本站 收藏本站
高级搜索 高级搜索
 新闻IT新闻 互联网 微软 黑客新闻 网络网络协议 故障 网络管理 TCP/IP 无线技术 解决方案 黑客技术 漏洞 软件评测 安全资讯
 数据MSsql Oracle Mysql PL/SQL 备份 系统:Linux vista Windows FTP 防火墙 注册表 服务器行情 服务器应用 解决方案 WEB服务器
 墙纸风景壁纸 游戏壁纸 体育壁纸 汽车壁纸 人文壁纸 影视壁纸 广告壁纸 花卉壁纸 节日壁纸 动漫壁纸 明星壁纸 绘画壁纸 月历壁纸
当前位置: > 主页>数据库技术>Oracle>PL/SQL>用T-SQL强制所有用户退出当前数据库
热门文章排行
 
热门文章排行 SQL 语法参考手册
SQL*NET 的加密问题
两个sql程序
用Oracle SQL实现文件访
用PL/SQL产生随机数
加速SQL查询的特征函数
Oracle PL/SQL语言基础
全面探讨PL/SQL的复合数
Oracle9i的简化SQL语法
PL/SQL中调用Java源对象
精采文章推荐
 
精采文章推荐 用T-SQL强制所有用户退
最新更新文章
 
最新更新文章 用T-SQL强制所有用户退
PL/SQL中调用Java源对象
Oracle9i的简化SQL语法
全面探讨PL/SQL的复合数
Oracle PL/SQL语言基础
加速SQL查询的特征函数
用PL/SQL产生随机数
用Oracle SQL实现文件访
两个sql程序
SQL*NET 的加密问题

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

编辑:   来源:  日期:2008-07-24   我要投稿      家园

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

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




上一篇:PL/SQL中调用Java源对象产生随机数  
下一篇:没有了
 关键字:  
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:

   文章评论:(0条)
  
 请留名: 匿名评论   点击查看所有评论
 

  责任编辑:IT学院  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。