sp_detach_db (Transact-SQL)

更新: 2006 年 12 月 12 日

從伺服器執行個體中卸離目前未使用的資料庫,並於卸離之前在所有資料表上選擇性地執行 UPDATE STATISTICS。

ms188031.note(zh-tw,SQL.90).gif重要事項:
必須是未發行的複寫資料庫,才能予以卸離。如需詳細資訊,請參閱本主題後面的<備註>一節。

主題連結圖示Transact-SQL 語法慣例

語法

sp_detach_db [ @dbname= ] 'database_name' 
    [ , [ @skipchecks= ] 'skipchecks' ] 
    [ , [ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' ] 

引數

  • [ @dbname = ] 'database_name'
    這是要卸離的資料庫名稱。database_namesysname 值,預設值是 NULL。
  • [ @skipchecks = ] 'skipchecks'
    指定要跳過或執行 UPDATE STATISTIC。skipchecksnvarchar(10) 值,預設值是 NULL。若要略過 UPDATE STATISTICS,請指定 true。若要明確執行 UPDATE STATISTICS,請指定 false

    依預設,會執行 UPDATE STATISTICS 來更新 SQL Server 2005 Database Engine 的資料表和索引中之資料的相關資訊。對於要移至唯讀媒體的資料庫而言,執行 UPDATE STATISTICS 很有用。

  • [ @keepfulltextindexfile= ] 'KeepFulltextIndexFile'
    指定在資料庫卸離作業期間,將不卸除與要卸離之資料庫相關聯的全文檢索索引檔案。KeepFulltextIndexFilenvarchar(10) 值,預設值是 true。如果 KeepFulltextIndexFilefalse,除非資料庫是唯讀的,否則與資料庫相關聯的所有全文檢索索引檔案和全文檢索索引的中繼資料都會卸除。如果為 NULL 或 true,則會保留全文檢索的相關中繼資料。

傳回碼值

0 (成功) 或 1 (失敗)

結果集

備註

限制

如果出現下列中的任何狀況,您便無法卸離資料庫:

  • 資料庫目前正在使用中。如需詳細資訊,請參閱本主題後面的<取得獨佔存取權>一節。
  • 如果已複寫,就表示已發行資料庫。
    在卸離資料庫之前,您必須先執行 sp_replicationdboption 來停用發行。
    ms188031.note(zh-tw,SQL.90).gif附註:
    如果您無法使用 sp_replicationdboption,可執行 sp_removedbreplication 來移除複寫。
  • 資料庫有資料庫快照集存在。
    在卸離資料庫之前,您必須先卸除它的所有快照集。如需詳細資訊,請參閱<如何:卸除資料庫快照集 (Transact-SQL)>。
    ms188031.note(zh-tw,SQL.90).gif附註:
    無法卸離或附加資料庫快照集。
  • 資料庫正在進行鏡像。
    在資料庫鏡像工作階段結束之前,您無法卸離資料庫。如需詳細資訊,請參閱<移除資料庫鏡像>。
  • 資料庫有疑問。
    在 SQL Server 2005 中,您必須先使有疑問的資料庫進入緊急模式,才能卸離該資料庫。如需有關如何使資料庫進入緊急模式的詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。
  • 此資料庫是系統資料庫。

卸離資料庫會清除 SQL Server 執行個體的計劃快取。清除計劃快取會導致重新編譯所有後續執行計劃,而且可能會導致查詢效能突然暫時下降。在 SQL Server 2005 Service Pack 2 中,針對每次清除計劃快取的快取存放區,SQL Server 錯誤記錄檔會包含下列參考訊息:「由於某些資料庫維護或重新設定作業,SQL Server 的 '%s' 快取存放區 (計劃快取的一部分) 發生 %d 次快取存放區排清。」只要快取發生排清,這個訊息就會每五分鐘記錄一次。

取得獨佔存取權

您需要有資料庫的獨佔存取權才能卸離資料庫。如果您要卸離的資料庫正在使用中,請先將資料庫設為 SINGLE_USER 模式以取得獨佔存取權,才能進行卸離。

例如,下列 ALTER DATABASE 陳述式會在所有現行使用者中斷與資料庫的連接之後,取得 AdventureWorks 資料庫的獨佔存取權:

USE master;
ALTER DATABASE AdventureWorks
SET SINGLE_USER;
GO
ms188031.note(zh-tw,SQL.90).gif附註:
若要強制現行使用者立即或在指定秒數內離開資料庫,請同時使用 ROLLBACK 選項:ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option。如需詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。

重新附加資料庫

卸離的檔案會保留下來,您可以利用 CREATE DATABASE 來重新附加它 (使用 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 選項)。您可以將這些檔案移到另一部伺服器,將它附加在那裡。

權限

需要 db_owner 固定資料庫角色中的成員資格。

範例

下列範例會卸離 skipchecks 設為 true 的 AdventureWorks 資料庫。

EXEC sp_detach_db 'AdventureWorks', 'true';

下列範例會卸離 AdventureWorks 資料庫並保留全文檢索索引檔和全文檢索索引的中繼資料。這個命令會執行 UPDATE STATISTICS,這是預設行為。

exec sp_detach_db @dbname='AdventureWorks'
    , @keepfulltextindexfile='true';

請參閱

參考

ALTER DATABASE (Transact-SQL)
CREATE DATABASE (Transact-SQL)

其他資源

卸離和附加資料庫
保護資料和記錄檔
如何:卸離資料庫 (SQL Server Management Studio)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

新增內容:
  • 在<備註>新增一節,加入清除計劃快取的相關資訊。
變更的內容
  • 釐清 @keepfulltextindexfile 參數的設定。

2006 年 7 月 17 日

新增內容:
  • 加入卸離系統資料庫的限制。

2006 年 4 月 14 日

新增內容:
  • 新增使用 @keepfulltextindexfile 的範例。
變更的內容
  • @KeepFulltextIndexFile 變更為 @keepfulltextindexfile

2005 年 12 月 5 日

新增內容:
  • 新增資料庫不能在使用中的限制,以及有關在執行 sp_detach_db 之前取得獨佔存取權的章節。