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_namesysname 値で、既定値は NULL です。

[ @skipchecks = ] 'skipchecks' UPDATE STATISTIC をスキップするか実行するかを指定します。 skipchecksnvarchar(10) 値で、既定値は NULL です。 UPDATE STATISTICS をスキップするには、 true を指定します。 UPDATE STATISTICS を明示的に実行するには、 false を指定します

既定では、テーブルとインデックス内のデータに関する情報を更新するために UPDATE STATISTICS が実行されます。 UPDATE STATISTICS の実行は、データベースを読み取り専用メディアに移動する場合に使用すると便利です。

[ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' デタッチするデータベースに関連付けられているフルテキスト インデックス ファイルが、データベースのデタッチ操作中に削除されないことを指定します。 KeepFulltextIndexFile は、既定値が true の nvarchar(10)ですKeepFulltextIndexFilefalse の場合、データベースが読み取り専用でない限り、データベースに関連付けられているすべてのフルテキスト インデックス ファイルとフルテキスト インデックスのメタデータが削除されます。 NULL または true の場合、フルテキスト関連のメタデータが保持されます。

重要

@keepfulltextindexfile パラメーターは、将来のバージョンの SQL Server で削除される予定です。 新しい開発作業ではこのパラメーターを使用せず、このパラメーターを現在使用しているアプリケーションはできるだけ早く変更してください。

リターン コードの値

0 (成功) または 1 (失敗)

結果セット

なし

解説

データベースがデタッチされると、そのすべてのメタデータが削除されます。 データベースがログイン アカウントの既定のデータベースである場合、 master は既定のデータベースになります。

Note

すべてのログイン アカウントの既定のデータベースを表示する方法については、「 sp_helplogins (Transact-SQL)」を参照してください。 必要なアクセス許可がある場合は、 ALTER LOGIN を 使用して、新しい既定のデータベースをログインに割り当てることができます。

制限

次のいずれかに該当する場合、データベースをデタッチすることはできません。

  • データベースは現在使用中です。 詳細については、このトピックで後述する「排他的アクセスの取得」を参照してください。

  • レプリケートされた場合、データベースは発行されます。

    データベースをデタッチする前に、 sp_replicationdboptionを実行して発行を無効にする必要があります。

    Note

    sp_replicationdboptionを使用できない場合、 sp_removedbreplicationを実行してレプリケーションを削除できます。

  • データベースに、データベース スナップショットが存在する。

    データベースをデタッチするには、すべてのデータベース スナップショットを削除する必要があります。 詳細については、「 データベース スナップショットの削除 (Transact-SQL)」を参照してください。

    Note

    データベース スナップショットのデタッチおよびアタッチは行うことができません。

  • データベースがミラー化されている。

    データベース ミラーリング セッションが終了するまで、データベースをデタッチすることはできません。 詳細については、「データベース ミラーリングの削除 (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  

Note

現在のユーザーをデータベースから直ちに、または指定した秒数以内に強制的に除外するには、ROLLBACK オプション (ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option) も使用します。 詳しくは、「 ALTER DATABASE (Transact-SQL)」をご覧ください。

データベースの再アタッチ

デタッチされたファイルは残り、CREATE DATABASE (FOR ATTACH または FOR ATTACH_REBUILD_LOG オプションを使用して) を使用して再アタッチできます。 ファイルを別のサーバーに移動し、そこにアタッチすることもできます。

アクセス許可

sysadmin 固定サーバー ロールのメンバーシップまたはデータベースのdb_owner ロールのメンバーシップが必要です。

次の例では、 skipchecks を true に設定して AdventureWorks2022 データベースをデタッチします。

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)
データベースのデタッチ