2009-11-10 30 views
120

我在SQL Server 2008中的模式上進行了有效的開發,並且經常要重新運行我的drop/create數據庫腳本。如果你正好在對象資源管理器窗格中的數據庫上單擊,然後從上下文菜單中刪除任務,當我運行如何在sql腳本中指定「關閉現有連接」

USE [master] 
GO 

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase') 
DROP DATABASE [MyDatabase] 
GO 

我經常會收到這樣的錯誤

Msg 3702, Level 16, State 4, Line 3 
Cannot drop database "MyDatabase" because it is currently in use. 

,有一個複選框,其中「關閉現有連接」

有沒有方法在腳本中指定此選項?

回答

189

可以斷開每個人都和回滾他們的交易有:

alter database [MyDatbase] set single_user with rollback immediate 

之後,您可以安全地刪除數據庫:)

+4

我用這個,但如果有機會的其他用戶能夠得到「單用戶」窗口經常在想 - 這可能嗎?可能的替代方法是ALTER DATABASE [MyDatabaseName] SET OFFLINE WITH ROLLBACK IMMEDIATE – Kristen 2009-11-10 23:04:19

+7

single_user中的用戶是你;除非您在設置單用戶模式後斷開連接。然後一(1)個其他用戶可以登錄。 – Andomar 2009-11-10 23:08:32

+0

謝謝;說得通。 – Kristen 2009-11-10 23:19:51

29

轉到管理工作室,做你所描述的一切,而不是隻點擊確定,點擊腳本。它將顯示它將運行的代碼,然後將其納入腳本中。

在這種情況下,你想:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
+1

我是布萊恩g嘗試通過完全描述你所描述的內容來回答這個問題(編寫「刪除數據庫」對話框的腳本),但是如果你選中「關閉現有連接」複選框,**不會將ALTER DATABASE行添加到腳本中。 – 2009-11-10 23:03:16

+0

從嚮導生成的腳本爲我包括'alter database'行。 – nick 2009-11-10 23:56:21

+0

奇怪。哪個Management Studio版本?我在2008年x64。 – 2009-11-11 00:25:48

12

按照ALTER DATABASE SET文件,還有一種可能性,即一個數據庫設置爲SINGLE_USER模式後,您將無法訪問該數據庫:

在將數據庫設置爲SINGLE_USER之前,請確認AUTO_UPDATE_STATISTICS_ASYNC選項已設置爲OFF。設置爲ON時,用於更新統計信息的後臺線程將與數據庫建立連接,並且您將無法以單用戶模式訪問數據庫。

所以,一個完整的腳本,刪除現有的連接數據庫可能是這樣的:

DECLARE @dbId int 
DECLARE @isStatAsyncOn bit 
DECLARE @jobId int 
DECLARE @sqlString nvarchar(500) 

SELECT @dbId = database_id, 
     @isStatAsyncOn = is_auto_update_stats_async_on 
FROM sys.databases 
WHERE name = 'db_name' 

IF @isStatAsyncOn = 1 
BEGIN 
    ALTER DATABASE [db_name] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 

    -- kill running jobs 
    DECLARE jobsCursor CURSOR FOR 
    SELECT job_id 
    FROM sys.dm_exec_background_job_queue 
    WHERE database_id = @dbId 

    OPEN jobsCursor 

    FETCH NEXT FROM jobsCursor INTO @jobId 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @sqlString = 'KILL STATS JOB ' + STR(@jobId) 
     EXECUTE sp_executesql @sqlString 
     FETCH NEXT FROM jobsCursor INTO @jobId 
    END 

    CLOSE jobsCursor 
    DEALLOCATE jobsCursor 
END 

ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

DROP DATABASE [db_name] 
2

我tryed SQL Server上什麼hgmnz SAIDS 2012

管理創建對我說:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase' 
GO 
USE [master] 
GO 
/****** Object: Database [MyDataBase] Script Date: 09/09/2014 15:58:46 ******/ 
DROP DATABASE [MyDataBase] 
GO 
+3

這將不會關閉活動連接。 – Jens 2016-08-11 14:06:11

+0

確保您選中了「關閉現有連接」;如果你不包含'ROLLBACK IMMEDIATE'語句將被包括在內。 「sp_delete_database_backuphistory」來自檢查「刪除數據庫的備份和還原歷史信息」。 – 2017-01-30 05:58:40

+0

如果沒有當前連接關閉,則檢查「關閉現有連接」不會生成「ALTER DATABASE SET SINGLE_USER ...」。 – ahwm 2018-02-23 17:34:39

0

我知道這太晚了,但可能是它幫助某人。使用這把你的數據庫脫機

ALTER DATABASE dbname SET OFFLINE