分享方式:


sp_detach_db (Transact-SQL)

適用於:SQL Server

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

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

Transact-SQL 語法慣例

語法

sp_detach_db
    [ [ @dbname = ] N'dbname' ]
    [ , [ @skipchecks = ] N'skipchecks' ]
    [ , [ @keepfulltextindexfile = ] N'keepfulltextindexfile' ]
[ ; ]

引數

[ @dbname = ] N'dbname'

要卸離的資料庫名稱。 @dbname為 sysname,預設值為 NULL

[ @skipchecks = ] N'skipchecks'

指定是否要略過或執行 UPDATE STATISTICS@skipchecks為 nvarchar(10),預設值為 NULL。 若要略過 UPDATE STATISTICS,請指定 true。 若要明確執行 UPDATE STATISTICS,請指定 false

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

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

指定在資料庫卸離作業期間不會卸除與卸離之資料庫相關聯的全文檢索索引檔案。 @keepfulltextindexfile為 nvarchar(10),預設值為 true

  • 如果 @keepfulltextindexfilefalse,除非資料庫是唯讀的,否則所有與資料庫相關聯的全文檢索索引檔案和全文檢索索引的元數據都會卸除。
  • 如果 NULL 為 或 true,則會保留全文檢索相關元數據。

重要

SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

傳回碼值

0 (成功) 或 1 (失敗)。

結果集

無。

備註

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

注意

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

限制

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

  • 資料庫目前正在使用中。 如需詳細資訊,請參閱 取得獨佔存取權。

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

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

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

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

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

    資料庫快照集無法中斷連結或附加。

  • 資料庫正在鏡像中。

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

  • 資料庫受質疑。

    您必須先將可疑資料庫置於緊急模式,才能卸離資料庫。 如需如何將資料庫放入緊急模式的詳細資訊,請參閱 ALTER DATABASE

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

取得獨佔存取權

卸離資料庫需要資料庫的獨佔存取權。 如果您想要卸離的資料庫正在使用中,在卸離資料庫之前,請先將資料庫設定為 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

重新附加資料庫

卸離的檔案會保留下來,而且可以使用 重新附加 CREATE DATABASE (搭配 FOR ATTACHFOR ATTACH_REBUILD_LOG 選項)。 檔案可以移至另一部伺服器,並附加至該處。

權限

需要系統管理員固定伺服器角色的成員資格,或資料庫db_owner角色的成員資格。

範例

本文中的 Transact-SQL 程式代碼範例會使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案首頁下載

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

EXEC sp_detach_db 'AdventureWorks2022', 'true';

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

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