设为首页 收藏本站
查看: 965|回复: 0

[经验分享] SQL Server中强制关闭数据库连接

[复制链接]

尚未签到

发表于 2015-7-3 02:40:34 | 显示全部楼层 |阅读模式
  1.问题引入

        在SQL Server中备份/还原/分离/脱机/删除指定数据库时, 如果有其他用户正在使用此数据库时, SQL Server为了防止数据异常, 会报错而终止你的操作.

   当然, 在SQL 2005里, 在做[分离/删除]数据库时提供了一个选项[关闭所以连接]供勾选(SQL 2000好像没有哦), 然而[备份/还原]操作却没有此选择, 也许你会说可以先[脱机数据库]再做[备份还原]操作, 对, 但你会发现[脱机]处理太慢了J, 那在SQL2005以及SQL 2000下有哪些方法可以解决此问题呢???   
2.解决方法:

1. 拔掉此机器的网线. 呵呵, 这种方法立竿见影, 但是可能对其他的连接造成影响.

2. 通知连接至此数据库的用户断开连接. 如果可能连接的用户很多或不知道哪个用户正在连接的话就不可行了.

3. 在SQL Server中用命令StopLogin强行断开连接.详细说明如下:

使用说明:

StopLogin @Dname

其中@Dname为要强行断开连接的数据库名称, 如果您想断开数据库’DEMO’的所有连接,则只要在查询分析器中执行[StopLogin ’DEMO’]即可, 如果您要断开所有数据库的连接进行维护的话则只要执行[StopLogin ’’]即可.


下面用例子说明:

EX1. 使用StopLogin强行断开连接前后SQL的执行结果对比

首先, 我们执行如下SQL语句:


USE DEMO2

GO

SELECT TOP 1 * FROM INVMB

执行结果为:

查询已成功执行



下面我们来执行如下SQL语句:


StopLogin 'DEMO2'


执行结果为:

由于数据库'DEMO2' 离线,无法打开该数据库。


3. StopLogin详细代码(写的仓促, 若有bug请谅解)

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[StopLogin]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    DROP PROCEDURE [dbo].[StopLogin]

GO


CREATE PROCEDURE StopLogin

    @Dname varchar(50)

AS

DECLARE

    @name varchar(50),

    @s varchar(1000)

BEGIN

    IF (@Dname = '')

    BEGIN

       DECLARE DataName CURSOR FOR

       SELECT name FROM sysdatabases WHERE name not in ('master')


       OPEN DataName


       FETCH NEXT FROM DataName

       INTO @name


       WHILE (@@FETCH_STATUS = 0)

       BEGIN   

           DECLARE tb CURSOR local     

           FOR   

           SELECT N'kill   '+CAST(spid AS varchar)   

           FROM master..sysprocesses     

           WHERE dbid=db_id(@name)   


           OPEN tb     


           FETCH next FROM tb INTO @s   


           WHILE @@FETCH_STATUS=0   

           BEGIN   

               EXEC(@s)   


               FETCH NEXT FROM tb INTO @s   

           END   


           CLOSE tb   

           DEALLOCATE tb

                        

           FETCH NEXT FROM DataName

           INTO @name

       END


       CLOSE DataName

       DEALLOCATE DataName

    END

    ELSE

    BEGIN

       DECLARE tb CURSOR local     

       FOR   

       SELECT N'kill   '+CAST(spid AS varchar)   

       FROM master..sysprocesses     

       WHERE dbid=db_id(@Dname)   


       OPEN tb   


       FETCH next FROM tb INTO @s


       WHILE @@FETCH_STATUS=0   

       BEGIN   

           EXEC(@s)   


           FETCH NEXT FROM tb INTO @s   

       END   


       CLOSE tb   

       DEALLOCATE tb

    END

  END


========================================================================
最好的方法就是 停止服务 即可,,,

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82629-1-1.html 上篇帖子: SQL Server Reporting Services 用户不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问 下篇帖子: Windows 不能在 本地计算机 启动 SQL Server 服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表