データベースのインポート

適用対象:SQL Server

この記事は、SQL Server Management Studio または Transact-SQL を使用して、SQL Server でデータベースをアタッチする方法について説明します。 この機能は、SQL Server データベースのコピー、移動、またはアップグレードに使用できます。

制限事項と制約事項

制限事項と制約事項の一覧については、「データベースのデタッチとアタッチ (SQL Server) を参照してください。

前提条件

続行する前に、次のすべての前提条件を確認してください。

  • あるインスタンスから別のインスタンスにデータベースを移動する場合、最初にそのデータベースを既存の SQL インスタンスからデタッチする必要があります。 デタッチされていないデータベースをアタッチしようとすると、エラーが返されます。 詳細については、「 データベースのデタッチ」を参照してください。

  • データベースをアタッチするときは、そのデータベースのすべてのデータ ファイルを利用できる状態にする必要があります。 多くの場合、これらのファイルの拡張子は .mdf または .ndf (データ ファイルの場合) と .ldf (トランザクション ログ ファイルの場合) です。 また、FILESTREAM データのすべてのファイル グループが存在し、使用可能である必要があります。 FILESTREAM が有効なデータベースのアタッチの詳細については、「FILESTREAM が有効なデータベースの移動」を参照してください。

  • データベースを最初に作成したときか最後にアタッチしたときとデータ ファイルのパスが異なる場合、ファイルの現在のパスを指定する必要があります。

  • データベース エンジン サービス アカウントには、新しい場所にあるファイルを読み取るためのアクセス許可が必要です。

  • MDF ファイルと LDF ファイルが異なるディレクトリ内にあり、いずれかのパスに \\?\GlobalRoot が含まれる場合、データベースをアタッチするとき、操作は失敗します。

アタッチの使用に適した状況

同一インスタンス内でデータベース ファイルを移動する場合は、デタッチ/アタッチではなく ALTER DATABASE による計画的な再配置手順によって、インスタンス内でデータベースを移動することをお勧めします。 詳細については、「 ユーザー データベースの移動」を参照してください。

バックアップと回復にデタッチとアタッチを使用することは推奨されません。 SQL Server から外部にバックアップされるファイルをデタッチするときに使用できる、トランザクション ログのバックアップやポイントインタイム リストアはありません。

セキュリティ

ファイル アクセス許可は、多くのデータベース操作中、たとえばデータベースのデタッチやアタッチを行うときに設定されます。 データベースがデタッチまたはアタッチされるときに、データベース エンジンは、操作を実行している接続の Windows アカウントの権限を借用し、データベース ファイルとログ ファイルにアクセスする権限がそのアカウントに与えられるようにします。 SQL Server ログインを使用する混合セキュリティ アカウントの場合、権限の借用は失敗する可能性があります。

次の表に、アタッチ操作またはデタッチ操作の完了後にデータベース ファイルとログ ファイルに設定されるアクセス許可と、接続しているアカウントの権限をデータベース エンジンが借用できるかどうかを示します。

操作 接続しているアカウントを偽装できます ファイルのアクセス許可が付与されます。
[デタッチ] はい 操作を実行しているアカウントのみ。 データベースのデタッチ後、必要に応じて、オペレーティング システムの管理者が追加アカウントを追加できます。
[デタッチ] いいえ SQL Server (MSSQLSERVER) サービス アカウントとローカルの Windows Administrators グループのメンバー。
[アタッチ] はい SQL Server (MSSQLSERVER) サービス アカウントとローカルの Windows Administrators グループのメンバー。
[アタッチ] いいえ SQL Server (MSSQLSERVER) サービス アカウント。

SQL Server サービスのサービスごとの SID に付与されているファイル システム権限の詳細については、「データベース エンジン アクセスのファイル システム権限の構成」を参照してください。

注意

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

アクセス許可

CREATE DATABASECREATE ANY DATABASE、または ALTER ANY DATABASE アクセス許可が必要です。

SQL Server Management Studio (SSMS) の使用

データベースを移動する前に

データベースを移動する場合は、その既存の SQL Server インスタンスからデタッチする前に、[データベースのプロパティ] ページを使用して、データベースに関連付けられているファイルとその現在の場所を確認します。

  1. SQL Server Management Studio で、オブジェクト エクスプローラーを使用して SQL Server データベース エンジンのインスタンスに接続し、インスタンスを展開します。

  2. [データベース]を展開し、デタッチするユーザー データベースの名前を選択します。

  3. データベース名を右クリックし、[プロパティ] を選択します。 [ファイル] ページ を選択し、[データベース ファイル:] テーブル のエントリを確認します。

デタッチ、移動、アタッチを行う前に、データベースに関連付けられているすべてのファイルを必ず考慮してください。 その後、次のセクションのデタッチ、ファイル コピー、データベースのアタッチの手順に進みます。 詳細については、「 データベースのデタッチ」を参照してください。

データベースのアタッチ

  1. オブジェクト エクスプローラーで、SQL Server データベース エンジンのインスタンスに接続し、SSMS でそのインスタンスビューを展開することを選択します。

  2. [データベース] を右クリックし、 [アタッチ] を選択します。

  3. [データベースのアタッチ] ダイアログ ボックスで、アタッチするデータベースを指定し、[追加] を選択します。 [データベース ファイルの検索] ダイアログ ボックスで、データベースが存在する場所を選択してディレクトリ ツリーを展開し、データベースの .mdf ファイルを見つけて選択します。たとえば、次のようなファイルです。

    C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_Data.mdf

    重要

    既にアタッチされているデータベースを選択しようとすると、エラーが発生します。

    [アタッチするデータベース]
    選択されたデータベースに関する情報を表示します。

    <空白の列ヘッダー>
    アタッチ操作の状態を示すアイコンが表示されます。 表示されるアイコンについては、「状態」の説明をご覧ください。

    [MDF ファイルの場所]
    選択した MDF ファイルのパスとファイル名が表示されます。

    データベース名
    データベースの名前が表示されます。

    [次の名前でアタッチ]
    データベースを別の名前でアタッチする場合に、その名前を指定します。

    所有者
    データベースの所有者のドロップダウン リストです。これを使用して、必要に応じて別の所有者を選択できます。

    状態
    次の表に示すように、データベースの状態を表示します。

    アイコン 状態テキスト 説明
    (アイコンなし) (テキストなし) このオブジェクトのアタッチ操作が開始されていないか、保留中の可能性があります。 これは、ダイアログ ボックスを開いたときの既定の状態です。
    緑の右向き三角形 進行中 アタッチ操作が開始されましたが、完了していません。
    緑のチェック マーク Success オブジェクトは正常にアタッチされました。
    赤い丸の中に白い×印 エラー アタッチ操作でエラーが発生し、正常に完了しませんでした。
    4 つに区切られた丸印 (左右の領域が黒、上下の領域が白) 停止 アタッチ操作を停止したため、正常に完了しませんでした。
    丸の中に反時計回りの矢印 [ロールバックされました] アタッチ操作は正常に完了しましたが、他のオブジェクトのアタッチ中にエラーが発生したため、ロールバックされました。

    メッセージ
    空白のメッセージ、または"ファイルが見つかりません"ハイパーリンクが表示されます。

    追加
    主な必須データベース ファイルを検索します。 .mdf ファイルを選択すると、[アタッチするデータベース] グリッドの対応するフィールドに、対応する情報が自動的に入力されます。

    Remove
    選択したファイルを [アタッチするデータベース] グリッドから削除します。

    "<database_name>" データベースの詳細]
    デタッチするファイルの名前を表示します。 ファイルのパス名を確認または変更するには、参照ボタン ([...]) を選択してください。

    注意

    ファイルが存在しない場合、[メッセージ] 列に "Not found" と表示されます。ログ ファイルが見つからない場合は、別のディレクトリに存在するか、削除されています。 [データベースの詳細] グリッドでファイル パスを更新し、正しい場所を指定するか、そのログ ファイルをグリッドから削除します。 .ndf データ ファイルが見つからない場合、グリッドのパスを更新して、正しい場所を指定する必要があります。

    [元のファイル名]
    データベースに属している、アタッチされたファイルの名前が表示されます。

    ファイルの種類
    ファイルの種類を表します。 [データ] または [ログ]になります。

    [現在のファイル パス]
    選択されているデータベース ファイルのパスを表示します。 このパスは手作業で編集できます。

    メッセージ
    空白のメッセージ、または"ファイルが見つかりません"ハイパーリンクが表示されます。

Transact-SQL の使用

データベースを移動する前に

データベースを移動する場合は、その既存の SQL Server インスタンスからデタッチされる前に、sys.database_files システム カタログ ビューを使用して、データベースに関連付けられているファイルとその現在の場所を確認します。 詳しくは「sys.database_files (Transact-SQL)」をご覧ください。

  1. SQL Server Management Studio で、[新しいクエリ] を選択してクエリ エディターを開きます。

  2. 次の Transact-SQL スクリプトをクエリ エディターにコピーして、[実行] を選択します。 このスクリプトによって、物理データベース ファイルの場所が表示されます。 デタッチ/アタッチを介してデータベースを移動するときは、必ずすべてのファイルを考慮してください。

    USE [database_name] 
    GO  
    SELECT type_desc, name, physical_name from sys.database_files;
    

デタッチ、移動、アタッチを行う前に、データベースに関連付けられているすべてのファイルを必ず考慮してください。 その後、次のセクションのデタッチ、ファイル コピー、データベースのアタッチの手順に進みます。 詳細については、「 データベースのデタッチ」を参照してください。

データベースをアタッチするには

  1. データベース エンジンに接続します。

  2. 標準バーから、 [新しいクエリ] を選択します。

  3. FOR ATTACH 句を含む CREATE DATABASE ステートメントを使用します。

    次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、AdventureWorks2022 データベースのすべてのファイルをアタッチし、データベースの名前を MyAdventureWorks に変更します。

    CREATE DATABASE MyAdventureWorks   
        ON (FILENAME = 'C:\MySQLServer\AdventureWorks_Data.mdf'),   
        (FILENAME = 'C:\MySQLServer\AdventureWorks_Log.ldf')   
        FOR ATTACH;  
    

    お使いのデータベースには、追加のデータ ファイル (一般的に .mdf または .ndf) が含まれる場合があります。また、CREATE DATABASE ... FOR ATTACH ステートメントに含める追加ファイルが必要な場合があります。 さらに、FILESTREAM データのファイル グループもステートメントに含める必要があります。 FILESTREAM が有効なデータベースのアタッチの詳細については、「FILESTREAM が有効なデータベースの移動」を参照してください。

    注意

    また、 sp_attach_db ストアド プロシージャまたは sp_attach_single_file_db ストアド プロシージャを使用することもできます。 ただし、これらのプロシージャは、Microsoft SQL Server の今後のバージョンでは削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに CREATE DATABASE ... FOR ATTACH を使用することをお勧めします。

SQL Server データベースのアップグレード後

データベース互換性レベル

アタッチする方法を使用してデータベースをアップグレードした後は、データベースが直ちに使用可能になります。 データベースは、新しいインスタンスの内部バージョン レベルに自動的にアップグレードされます。 データベースにフルテキスト インデックスがある場合、アップグレード プロセスでは、 "フルテキスト アップグレード オプション" サーバー プロパティの設定に応じて、インポート、リセット、または再構築が行われます。 アップグレード オプションが [インポート] または [再構築]に設定されている場合、アップグレード中、フルテキスト インデックスは使用できません。 インデックスを作成するデータ量によっては、インポートに数時間、再構築には最大でその 10 倍の時間がかかることがあります。 なお、アップグレード オプションが [インポート] に設定されており、フルテキスト カタログが使用できない場合は、関連付けられたフルテキスト インデックスが再構築されます。

アップグレード後は、以前の互換性レベルが新しいバージョンでサポートされていない場合を除き、データベースの互換性レベルはアップグレード前の互換性レベルのままです。 この場合、アップグレードされたデータベースの互換性レベルは、サポートされている最低の互換性レベルに設定されます。 たとえば、SQL Server 2019 (15.x) のインスタンスにアタッチする前の互換性レベルが 90 であったデータベースをアタッチする場合、アップグレード後、互換性レベルは 100 に設定されます。これは、SQL Server 2019 (15.x) でサポートされている最低の互換性レベルです。 詳細については、「ALTER DATABASE 互換性レベル (Transact-SQL)」を参照してください。

変更データ キャプチャ (CDC)

Change Data Capture (CDC) が有効な SQL Server 2014 (12.x) 以前のインスタンスからデータベースをアタッチする場合は、次のコマンドを実行して、Change Data Capture (CDC) メタデータをアップグレードする必要があります。

USE <database name>
EXEC sys.sp_cdc_vupgrade  

詳細については、Windows 上で SQL Server 2016 または SQL Server 2017 のインスタンスに CDC 対応データベースをアタッチするときのエラーに関するページをご覧ください。

関連項目

次のステップ