sp_detach_db (Transact-SQL)

更新 : 2006 年 12 月 12 日

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

ms188031.note(ja-jp,SQL.90).gif重要 :
レプリケートしたデータベースをデタッチする場合、パブリッシュを解除する必要があります。詳細については、後の「解説」を参照してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • [ @dbname = ] 'database_name'
    デタッチするデータベースの名前を指定します。database_name のデータ型は sysname で、既定値は NULL です。
  • [ @skipchecks = ] 'skipchecks'
    UPDATE STATISTIC をスキップするか、実行するかを指定します。skipchecks のデータ型は nvarchar(10) で、既定値は NULL です。UPDATE STATISTICS をスキップするには、true を指定します。UPDATE STATISTICS を明示的に実行するには、false を指定します。

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

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

リターン コードの値

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

結果セット

なし

解説

制限事項

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

  • データベースが現在使用されている。詳細については、後の「排他アクセスの取得」を参照してください。
  • データベースがレプリケートされ、パブリッシュ済みとなっている。
    データベースをデタッチする前に、sp_replicationdboption を実行してパブリッシングを無効にする必要があります。
    ms188031.note(ja-jp,SQL.90).gifメモ :
    sp_replicationdboption を使用できない場合、sp_removedbreplication を実行してレプリケーションを削除できます。
  • データベースに、データベース スナップショットが存在する。
    データベースをデタッチするには、すべてのデータベース スナップショットを削除する必要があります。詳細については、「データベース スナップショットを削除する方法 (Transact-SQL)」を参照してください。
    ms188031.note(ja-jp,SQL.90).gifメモ :
    データベース スナップショットのデタッチおよびアタッチは行うことができません。
  • データベースがミラー化されている。
    データベース ミラーリングのセッションが終了するまでは、データベースはデタッチできません。詳細については、「データベース ミラーリングの削除」を参照してください。
  • データベースに問題がある。
    SQL Server 2005 では、問題のあるデータベースをデタッチする前に、データベースを緊急モードに設定する必要があります。データベースを緊急モードにする方法の詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。
  • データベースがシステム データベースである。

データベースをデタッチすると、SQL Server のインスタンスのプラン キャッシュが消去されます。プラン キャッシュが消去されると、後続のすべての実行プランが再コンパイルされ、場合によっては、クエリ パフォーマンスが一時的に急激に低下します。SQL Server 2005 Service Pack 2 では、プラン キャッシュ内のキャッシュストアが消去されるたびに、"SQL Server は、一部のデータベース メンテナンス操作または再構成操作により、'%s' キャッシュストア (プラン キャッシュの一部) のキャッシュストア フラッシュを %d 個検出しました。" という情報メッセージが SQL Server エラー ログに記録されます。このメッセージは、キャッシュが 5 分以内にフラッシュされる場合に限り、その間隔でログに記録されます。

排他アクセスの取得

データベースのデタッチには、データベースに対する排他アクセスが必要です。デタッチするデータベースが使用されている場合、デタッチするには、データベースを SINGLE_USER モードに設定して排他アクセスを取得する必要があります。

たとえば、次の ALTER DATABASE ステートメントでは、現在のすべてのユーザーがデータベースから切断した後で、AdventureWorks データベースへの排他アクセスを取得します。

USE master;
ALTER DATABASE AdventureWorks
SET SINGLE_USER;
GO
ms188031.note(ja-jp,SQL.90).gifメモ :
データベースから現在のユーザーを直ちに、または指定した秒数で切り離すには、ROLLBACK オプションも使用して「ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option」と指定します。詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

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

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

権限

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

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

EXEC sp_detach_db 'AdventureWorks', 'true';

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

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

参照

関連項目

ALTER DATABASE (Transact-SQL)
CREATE DATABASE (Transact-SQL)

その他の技術情報

データベースのデタッチとアタッチ
データ ファイルとログ ファイルのセキュリティ保護
データベースをデタッチする方法 (SQL Server Management Studio)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

新しい内容 :
  • プラン キャッシュの消去に関するセクションを「解説」に追加。
変更内容
  • @keepfulltextindexfile パラメータの設定を明記。

2006 年 7 月 17 日

新しい内容 :
  • システム データベースのデタッチに対して、制限を追加。

2006 年 4 月 14 日

新しい内容 :
  • @keepfulltextindexfile を使用した例を追加。
変更内容
  • @KeepFulltextIndexFile@keepfulltextindexfile に変更。

2005 年 12 月 5 日

新しい内容 :
  • データベースが使用中の場合はデタッチできないという制限と、sp_detach_db の実行前に排他アクセスを取得する必要があるという説明を追加。