SQL Server中強制關閉資料庫連接

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.