sp_detach_db (Transact-SQL)

適用於:SQL Server

卸離目前未使用的資料庫與伺服器實例,並選擇性地在所有資料表上執行 UPDATE STATISTICS,然後再卸離。

重要

若要卸離複寫的資料庫,它必須取消發佈。 如需詳細資訊,請參閱本主題稍後的一節。

Transact-SQL 語法慣例

語法

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

引數

[ @dbname = ] 'database_name' 這是要卸離的資料庫名稱。 database_name sysname 值,預設值為 Null。

[ @skipchecks = ] 'skipchecks' 指定是否要略過或執行 UPDATE STATISTICS。 skipchecks Nvarchar(10) 值,預設值為 Null。 若要略過 UPDATE STATISTICS,請指定 true 。 若要明確執行 UPDATE STATISTICS,請指定 false

根據預設,會執行 UPDATE STATISTICS 來更新資料表和索引中資料的相關資訊。 執行 UPDATE STATISTICS 對於要移至唯讀媒體的資料庫很有用。

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

重要

未來的 SQL Server 版本將會移除@keepfulltextindexfile 參數。 請勿在新的開發工作中使用此參數,並儘快修改目前使用此參數的應用程式。

傳回碼值

0 (成功) 或 1 (失敗)

結果集

None

備註

卸離資料庫時,會卸載其所有中繼資料。 如果資料庫是任何登入帳戶的預設資料庫, master 就會變成其預設資料庫。

注意

如需如何檢視所有登入帳戶之預設資料庫的詳細資訊,請參閱 sp_helplogins (Transact-SQL) 。 如果您有必要的許可權,您可以使用 ALTER LOGIN 將新的預設資料庫指派給登入。

限制

如果下列任一項成立,就無法中斷連結資料庫:

  • 資料庫目前正在使用中。 如需詳細資訊,請參閱本主題稍後的。

  • 如果複寫,就會發佈資料庫。

    您必須先執行 sp_replicationdboption 來停用發行,才能卸離資料庫。

    注意

    如果您無法使用 sp_replicationdboption,可執行 sp_removedbreplication來移除複寫。

  • 資料庫有資料庫快照集存在。

    在卸離資料庫之前,您必須先卸除它的所有快照集。 如需詳細資訊,請參閱卸除資料庫快照集 (Transact-SQL)

    注意

    無法卸離或附加資料庫快照集。

  • 資料庫正在鏡像中。

    在資料庫鏡像會話終止之前,無法中斷連結資料庫。 如需詳細資訊,請參閱移除資料庫鏡像 (SQL Server)

  • 資料庫受質疑。

    您必須先將可疑資料庫置於緊急模式,才能卸離資料庫。 如需有關如何使資料庫進入緊急模式的詳細資訊,請參閱 ALTER DATABASE (Transact-SQL)

  • 此資料庫是系統資料庫。

取得獨佔存取權

卸離資料庫需要資料庫的獨佔存取權。 如果您想要卸離的資料庫正在使用中,在卸離資料庫之前,請先將資料庫設定為SINGLE_USER模式,以取得獨佔存取權。

將資料庫設定為SINGLE_USER之前,請確認 [AUTO_UPDATE_STATISTICS_ASYNC] 選項已設定為 OFF。 當此選項設定為 ON 時,用來更新統計資料的背景執行緒會針對資料庫進行連線,而且您無法以單一使用者模式存取資料庫。 如需詳細資訊,請參閱 將資料庫設定為單一使用者模式

例如,下列 ALTER DATABASE 語句會取得 AdventureWorks2022 資料庫的獨佔存取權,之後所有目前的使用者都中斷與資料庫的連接。

USE master;  
ALTER DATABASE AdventureWorks2022  
SET SINGLE_USER;  
GO  

注意

若要在指定的秒數內或立即強制目前的使用者離開資料庫,也請使用 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 角色的成員 資格。

範例

下列範例會將 AdventureWorks2022 資料庫 中斷連結,並將 skipchecks 設定為 true。

EXEC sp_detach_db 'AdventureWorks2022', 'true';  

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

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

另請參閱

ALTER DATABASE (Transact-SQL)
資料庫卸離與附加 (SQL Server)
CREATE DATABASE (SQL Server Transact-SQL)
卸離資料庫