sp_detach_db (Transact-SQL)

適用対象: SQL Server

現在使用されていないデータベースをサーバー インスタンスからデタッチし、必要に応じて、デタッチする前にすべてのテーブルで UPDATE STATISTICS 実行します。

レプリケートしたデータベースをデタッチする場合、パブリッシュを解除する必要があります。 詳細については、この記事で後述する「 Remarks 」セクションを参照してください。

Transact-SQL 構文表記規則

構文

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

引数

[ @dbname = ] N'dbname'

デタッチするデータベースの名前。 @dbnamesysname で、既定値は NULL です。

[ @skipchecks = ] N'skipchecks'

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

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

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

デタッチ対象のデータベースに関連付けられているフルテキスト インデックス ファイルが、データベースデタッチ操作中に削除されないように指定します。 @keepfulltextindexfilenvarchar(10) で、既定値は true です。

  • @keepfulltextindexfilefalseされている場合、データベースが読み取り専用でない限り、データベースに関連付けられているすべてのフルテキスト インデックス ファイルとフルテキスト インデックスのメタデータが削除されます。
  • 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>;

詳細については、[ALTER DATABASE](/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options) に関する記事をご覧ください。

データベースを再アタッチする

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

アクセス許可

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

この記事の Transact-SQL コード サンプルは AdventureWorks2022 または AdventureWorksDW2022 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。

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

EXEC sp_detach_db 'AdventureWorks2022', 'true';

次の例では、 AdventureWorks2022 データベースをデタッチし、フルテキスト インデックス ファイルとフルテキスト インデックスのメタデータを保持します。 このコマンドでは、UPDATE STATISTICS が実行されます。これは既定の動作です。

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