﻿# 在 SQL Server 中如何成功卸離資料庫

有時後我們為了要將資料庫的資料檔(\*.mdf)與紀錄檔(\*.ldf)複製出來，會需要先暫時卸離資料庫(Detach Database)，因為卸離資料庫需要有資料庫的獨佔存取權，但是不管是在測試機或正式機上，資料庫往往都會因為還有連線存在導致資料庫無法卸離，對於這點我通常有兩種作法。

**第一種：若連線不多的話，我會手動將現有連線強制關閉**

![Management Studio - 活動監視器](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/fdb597156b25ba93de3e-image_3.png)

只要跟要卸離的資料庫相關的連線都被清除了之後，就可以成功卸離資料庫了。

**第二種：設定資料庫屬性的選項，將限制存取切換到 SINGLE\_USER 單人模式**

[![資料庫屬性的選項](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/84a7275b76f1ef95f3ac-image_thumb_1.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4160d64afa18f4b1f3c9-image_5.png)

![將限制存取切換到 SINGLE\_USER 單人模式](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f365865ba55906b9a979-image_8.png)

將資料庫切換到 SINGLE\_USER 單人模式後，所有現有的連線就會被中斷，這樣一來也就可以成功卸離資料庫了。

而我也用之前 "[查詢透過Management Studio 的GUI 所執行的T-SQL 指令](/post/2008/06/05/Find-out-T-SQL-commands-generated-by-SQL-Server-Management-Studio "查詢透過Management Studio 的GUI 所執行的T-SQL 指令")" 文章所講的技巧，查出了 T-SQL 的用法，以後直接下 T-SQL 就可以成功卸離了。

1\. 切換到 SINGLE\_USER 單人模式

```
USE [master]
GO
ALTER DATABASE [DBName] SET  SINGLE_USER WITH NO_WAIT
GO
ALTER DATABASE [DBName] SET  SINGLE_USER 
GO
```

2\. 卸離資料庫

```
USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'DBName', @skipchecks = 'false', 
                             @keepfulltextindexfile=N'true'
GO
```

之後若要附加資料庫可以用以下 T-SQL，預設附加上去後就是 MULTI\_USER 多人模式了：

```
USE [master]
GO
CREATE DATABASE [DBName] ON 
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DBName.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DBName_log.LDF' )
 FOR ATTACH
GO
```

若要手動將資料庫調回 MULTI\_USER 多人模式也可以用以下 T-SQL 語法：

```
USE [master]
GO
ALTER DATABASE [DBName] SET  MULTI_USER WITH NO_WAIT
GO
ALTER DATABASE [DBName] SET  MULTI_USER 
GO
```

**相關連結**

-   [ALTER DATABASE (Transact-SQL)](http://msdn.microsoft.com/zh-tw/library/ms174269.aspx)
-   [CREATE DATABASE (Transact-SQL)](http://msdn.microsoft.com/zh-tw/library/ms176061.aspx)
-   [sp\_detach\_db (Transact-SQL)](http://msdn.microsoft.com/zh-tw/library/ms188031.aspx)
-   [卸離和附加資料庫](http://msdn.microsoft.com/zh-tw/library/ms190794.aspx)
-   [如何：卸離資料庫 (SQL Server Management Studio)](http://msdn.microsoft.com/zh-tw/library/ms191491.aspx)
-   [如何：附加資料庫 (SQL Server Management Studio)](http://msdn.microsoft.com/zh-tw/library/ms190209.aspx)
