sp_attach_db (Transact-SQL)

適用対象: SQL サーバー

データベースをサーバーにアタッチします。

重要

この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに CREATE DATABASE <database_name> FOR ATTACH を使用することをお勧めします。 詳細については、[CREATE DATABASE](/sql/t-sql/statements/create-database-sql-server-transact-sql) に関する記事をご覧ください。 1 つ以上の場所が新しい場合に複数のログ ファイルを再構築するには、 CREATE DATABASE <database_name> FOR ATTACH_REBUILD_LOGを使用します。

不明なソースまたは信頼されていないソースからデータベースをアタッチまたは復元しないでください。 こうしたデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更してエラーを発生させるような、悪意のあるコードが含まれている可能性があります。 不明または信頼できないソースのデータベースを使用する前に、運用サーバー以外のサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。

構文

sp_attach_db
    [ @dbname = ] N'dbname'
    , [ { @filename1 ... @filename16 } = ] { N'*filename1*' ... N'*filename16*' }
[ ; ]

引数

[ @dbname = ] N'dbname'

サーバーに接続するデータベースの名前。 @dbnamesysname で、既定値はありません。

[ { @filename1 ... @filename16 } = ] { N'filename1' ...N'filename16' }

データベース ファイルの物理名 (パスを含む)。 このパラメーターは nvarchar(260)で、既定値は NULL です。 最大 16 個のファイル名を指定できます。 パラメーター名は @filename1 から始まり、 @filename16にインクリメントされます。 ファイル名の一覧には、少なくともプライマリ ファイル (.mdf) が含まれている必要があります。 プライマリ ファイルには、データベース内の他のファイルを指すシステム テーブルが含まれています。 一覧には、データベースのデタッチ後に移動されたファイルも含める必要があります。

このパラメーターは、CREATE DATABASE ステートメントの FILENAME パラメーターにマップされます。 詳細については、[CREATE DATABASE](/sql/t-sql/statements/create-database-sql-server-transact-sql) に関する記事をご覧ください。

Note

フルテキスト カタログ ファイルを含む SQL Server 2005 (9.x) データベースを新しいバージョンの SQL Server にアタッチすると、SQL Server 2005 (9.x) と同じように、カタログ ファイルは以前の場所から他のデータベース ファイルと共にアタッチされます。 詳細については、「フルテキスト検索のアップグレード」を参照してください。

リターン コードの値

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

結果セット

ありません。

解説

sp_attach_db ストアド プロシージャは、明示的なsp_detach_db操作またはコピーされたデータベースを使用して、以前にデータベース サーバーからデタッチされたデータベースでのみ実行する必要があります。 16 個を超えるファイルを指定する必要がある場合は、 CREATE DATABASE <database_name> FOR ATTACH または CREATE DATABASE <database_name> FOR_ATTACH_REBUILD_LOGを使用します。 詳細については、[CREATE DATABASE](/sql/t-sql/statements/create-database-sql-server-transact-sql) に関する記事をご覧ください。

指定されていないファイルは、最後の既知の場所にあると見なされます。 異なる場所にあるファイルを使用するには、新しい場所を指定する必要があります。

最新バージョンの SQL Server で作成したデータベースは、それ以前のバージョンでアタッチすることはできません。

Note

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

デタッチされずにコピーされたレプリケートされたデータベースをアタッチする場合は、次の条件を考慮してください。

  • データベースを元のデータベースと同じサーバー インスタンスとバージョンにアタッチする場合、それ以上の手順は必要ありません。

  • 同じサーバー インスタンスのアップグレードされたバージョンにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_vupgrade_replication を実行してレプリケーションをアップグレードする必要があります。

  • バージョンに関係なく、別のサーバー インスタンスにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_removedbreplication を実行してレプリケーションを削除する必要があります。

データベースが SQL Server の新しいインスタンスに最初にアタッチまたは復元されるとき、サービス マスター キー (SMK) によって暗号化されたデータベース マスター キー (DMK) のコピーはまだサーバーに格納されません。 DMK の暗号化を解除するには、 OPEN MASTER KEY ステートメントを使用する必要があります。 DMK の暗号化が解除されたら、 ALTER MASTER KEY REGENERATE ステートメントを使用して、SMK で暗号化された DMK のコピーをサーバーに提供することで、将来自動復号化を有効にできます。 データベースを以前のバージョンからアップグレードする場合は、新しい AES アルゴリズムを使用するために DMK を再生成する必要があります。 DMK を再作成する方法については、「ALTER MASTER KEY (Transact-SQL)」を参照してください。 DMK キーを再作成して AES にアップグレードするのに必要な時間は、DMK によって保護されているオブジェクトの数によって異なります。 AES にアップグレードするために DMK キーを再生成する必要があるのは 1 回だけであり、キー ローテーション戦略の一環として将来の再生成には影響しません。

アクセス許可

データベースがアタッチされるときにアクセス許可がどのように処理されるかについては、「 CREATE DATABASEを参照してください。

次の例では、 AdventureWorks2022 から現在のサーバーにファイルをアタッチします。

EXEC sp_attach_db @dbname = N'AdventureWorks2022',
    @filename1 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2022_Data.mdf',
    @filename2 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2022_log.ldf';