none
如何清除sqlserver2005里的其中一个数据库的连接 RRS feed

  • 问题

  • 因为我要利用C# 做一个还原数据库的操作,所以要清除掉那个需要还原的数据库的现有连接,才能进行还原,不然会还原失败,我在网上差了一下

    利用 EXEC sys.sp_who  @loginame = NULL  -- sysname 存储过程查看,但是没有说到怎麽清除,求大侠帮助

    数据库是GPOSDB


    给我写信: QQ我:点击这里给我发消息

    2012年4月22日 15:46

答案

  • 您好,
    那個是2個Session的!
    SET SINGLE_USER的用意只是想讓目前連接GPOSDB的Session離線!
    如果下指令的這個Session目前連接GPOSDB則不會離線!
    所以請您在同一個Session中執行,謝謝!

    SET SINGLE_USER的效果只針對那個Database而已,不會針對個整Server!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月24日 2:48

全部回复

  • 您好,

    請使用Kill


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月23日 3:25
  • kill? 怎麽使用,有代码吗? 用C# 还是存储过程还是什么?

    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 4:37
  • 您好,

    是T-SQL,

    如果您要刪除session 54的話,就打

    kill 54

    就可以了!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年4月23日 5:14
  • 就是说我可以写一个存储过程,存储过程实现把所有的dbname是GPOSDB的连接kill掉,然后用C#调用存储过程,存储过程返回成功就执行数据库还原操作?

    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 5:39
  • 您好,

    您可以先试着使用以下的方式,试看看!

    ----Make Database to single user Mode
    ALTER DATABASE YourDB
    SET SINGLE_USER WITH
    ROLLBACK IMMEDIATE
    
    ----Restore Database
    RESTORE DATABASE YourDB
    FROM DISK = 'D:BackUpYourBaackUpFile.bak'
    WITH MOVE 'YourMDFLogicalName' TO 'D:DataYourMDFFile.mdf',
    MOVE 'YourLDFLogicalName' TO 'D:DataYourLDFFile.ldf'
    
    /*If there is no error in statement before database will be in multiuser
    mode.
    If error occurs please execute following command it will convert
    database in multi user.*/
    ALTER DATABASE YourDB SET MULTI_USER
    GO
    Ref:SQL SERVER – Restore Database Backup using SQL Script (T-SQL)


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月23日 7:15
  • 什么意思?


    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 7:51
  • 您好,

    您可看一下您的SSMS,上面是不是就是(54)呢!

    表示目前那個連線者就是您開的這個視窗,所以您目前這個連線連到的DB是「GPOSDB」。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年4月23日 8:47
  • 的确是,要新建一个查询

    你上一个回答:SET SINGLE_USER  ,实际上这个语句有什么作用,是删除当前GPOSDB这个库的所有连接吗?


    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 9:33
  • 桦仔您好,

    SET SINGLE_USER  : 将数据库设置为 SINGLE_USER 模式,以获得独占访问权!

    这样您就不需要下KILL了!您可以试试看哦!

    請參考:ALTER DATABASE SET 选项 (Transact-SQL)!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月23日 9:44
  • 不是的,就算用独占模式,还是有一个进程访问数据库,就是执行这些语句的那个进程

    ----Make Database to single user Mode
    ALTER DATABASE YourDB
    SET SINGLE_USER WITH
    ROLLBACK IMMEDIATE

    如果要没有任何进程访问的话就不行了



    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 9:55
  • 您好,

    小弟看到您的SSMS目前是Query2 是連到GPOSDB! Query3要去连就不给连了!

    一般來說,如果您要Restore DB的話,都是先下ALTER DATABASE [DBName] SET  SINGLE_USER

    下了那个之后,所有目前连GPOSDB的Session都会断掉哦!

    这时您就能Restore DB了!

    当然,如果您要KILL所有的连线,也可以哦!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    2012年4月23日 10:02
  • 我知道,我的意思是如果当前有程序连接到GPOSDB这个库,你的脚本也不能生效,你的脚本的使用环境是当前没有程序连接到GPOSDB了


    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 10:13
  • 您好,

    您說的對!

    那個脚本應該要先use到master,如下!

    USE master
    go
    
    ALTER DATABASE GPOSDB
    SET SINGLE_USER WITH
    ROLLBACK IMMEDIATE
    
    --Restore DB
    --
    
    ALTER DATABASE TR_RADAR_M
    SET MULTI_USER  WITH
    ROLLBACK IMMEDIATE


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月23日 10:36
  • 实际上数据库还原的代码我同事已经写好了,只是他不知道怎样才能删除当前对GPOSDB库的连接。

    按照你的脚本,我的思路是:

    1、先调用你的存储过程脚本:

    USE master
    go

    ALTER DATABASE GPOSDB
    SET SINGLE_USER WITH
    ROLLBACK IMMEDIATE

    2、再执行我同事的数据库还原代码:

            /// <summary>
            /// 还原数据库
            /// </summary>
            /// <param name="filename">文件路径</param>
            /// <returns></returns>
            public static bool DataRestoreUp(string filename)
            {
                string strConn = "server=" + ForumConfig.ReadConfigInfo().DBServerName + ";uid=" +
                     ForumConfig.ReadConfigInfo().User + ";pwd=" + ForumConfig.ReadConfigInfo().PWD +
                     ";database=master";
                try
                {
                    SqlConnection IsConn = new SqlConnection(strConn);
                    IsConn.Open();
                    string strSQL = "RESTORE DATABASE  " + ForumConfig.ReadConfigInfo().DBName + " FROM DISK = '" + filename + "'";
                    using (SqlCommand command = new SqlCommand(strSQL, IsConn))
                    {
                        command.CommandType = CommandType.Text;
                        command.ExecuteNonQuery();
                    }
                    IsConn.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    WriteDataErrLog.WriteDataErrDetail(strConn, ex.Message);
                    return false;
                    
                }
                
            }
    
            #endregion

    3、最后执行你的存储过程脚本:

    ALTER DATABASE GPOSDB

    SET MULTI_USER WITH
    ROLLBACK IMMEDIATE



    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 11:18
  • 刚才试了还是不行

    我先执行:

    USE master
    ALTER DATABASE GPOSDB
    SET SINGLE_USER WITH
    ROLLBACK IMMEDIATE

    EXEC sys.sp_who  @loginame = NULL -- sysname

    结果:

    后打开公司的winform程序进行数据库还原操作

    然后执行:

    USE master
    ALTER DATABASE GPOSDB
    SET MULTI_USER WITH
    ROLLBACK IMMEDIATE

    程序的连接字符串是的用户是hengshan,权限是

    所有的语句都是在hengshan这个用户下执行的


    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 13:33
  • 您好,

    SQL Script請全都在SSMS中執行,或是全都在winform程序中執行,

    因為您一個在SSMS中執行,一個在winform程序中執行,分別會佔2個Session吧!

    hengshan的用戶對映能先設到master db,然後試看看是否ok哦! Thanks.

     


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年4月23日 16:17
  • SSMS不是MSSM,还有hengshan这个用户先可以进行备份跟还原操作的, 关键是如果像你所说“一個在MSSM中執行,一個在winform程序中執行,分別會佔2個Session吧”

    但是你有没有看到我的sql script:

    USE master
    ALTER DATABASE GPOSDB
    SET MULTI_USER WITH
    ROLLBACK IMMEDIATE

    没有连接到GPOSDB,除非像你所说“一個在MSSM中執行,一個在winform程序中執行,分別會佔2個Session”,那么就是说整个服务器都外界都不能连接,不单只GPOSDB

    这个库


    给我写信: QQ我:点击这里给我发消息

    2012年4月23日 16:49
  • 您好,
    那個是2個Session的!
    SET SINGLE_USER的用意只是想讓目前連接GPOSDB的Session離線!
    如果下指令的這個Session目前連接GPOSDB則不會離線!
    所以請您在同一個Session中執行,謝謝!

    SET SINGLE_USER的效果只針對那個Database而已,不會針對個整Server!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月24日 2:48
  • 明白   谢谢乱马客

    给我写信: QQ我:点击这里给我发消息

    2012年4月24日 4:07
  • 不用客氣!很高興能幫的上忙!

    欢迎常来MSDN交流技术、分享知识!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年4月24日 4:46