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 |