sp_detach_db (Transact-SQL)
適用対象: SQL Server
現在使用されていないデータベースをサーバー インスタンスからデタッチし、必要に応じて、デタッチする前にすべてのテーブルで UPDATE STATISTICS
実行します。
レプリケートしたデータベースをデタッチする場合、パブリッシュを解除する必要があります。 詳細については、この記事で後述する「 Remarks 」セクションを参照してください。
構文
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
です。
- @keepfulltextindexfileが
false
されている場合、データベースが読み取り専用でない限り、データベースに関連付けられているすべてのフルテキスト インデックス ファイルとフルテキスト インデックスのメタデータが削除されます。 NULL
またはtrue
場合は、フルテキスト関連のメタデータが保持されます。
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。
リターン コードの値
0
(成功) または 1
(失敗)。
結果セット
ありません。
解説
データベースがデタッチされると、そのすべてのメタデータが削除されます。 データベースがログイン アカウントの既定のデータベースである場合、 master
は既定のデータベースになります。
Note
すべてのログイン アカウントの既定のデータベースを表示する方法については、 sp_helploginsを参照してください。 必要なアクセス許可がある場合は、 ALTER LOGIN を使用して、新しい既定のデータベースをログインに割り当てることができます。
制限事項
次のいずれかに該当する場合、データベースをデタッチすることはできません。
データベースは現在使用中です。 詳細については、「 Obtain 排他アクセスを参照してください。
レプリケートされた場合、データベースが発行されます。
データベースをデタッチする前に、 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>;
詳細については、
データベースを再アタッチする
デタッチされたファイルは残り、 CREATE DATABASE
( FOR ATTACH
または FOR ATTACH_REBUILD_LOG
オプション) を使用して再アタッチできます。 ファイルを別のサーバーに移動し、そこにアタッチすることもできます。
アクセス許可
sysadmin固定サーバー ロールのメンバーシップ、またはデータベースのdb_owner ロールのメンバーシップが必要です。
例
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
次の例では、@skipchecksを true
に設定して、AdventureWorks2022
データベースをデタッチします。
EXEC sp_detach_db 'AdventureWorks2022', 'true';
次の例では、 AdventureWorks2022
データベースをデタッチし、フルテキスト インデックス ファイルとフルテキスト インデックスのメタデータを保持します。 このコマンドでは、UPDATE STATISTICS が実行されます。これは既定の動作です。
EXEC sp_detach_db @dbname = 'AdventureWorks2022',
@keepfulltextindexfile = 'true';