デタッチとアタッチを使用してデータベースをアップグレードする方法 (Transact-SQL)

更新 : 2005 年 12 月 5 日

ms189625.security(ja-jp,SQL.90).gifセキュリティ メモ :
不明なソースや信頼されていないソースからのデータベースは、アタッチまたは復元しないことをお勧めします。そのようなデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更することによりエラーを発生させる悪意のあるコードが含まれている可能性があるからです。不明なソースや信頼されていないソースのデータベースを使用する前に、運用に使用していないサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。

SQL Server 2005 では、デタッチとアタッチを使用して、SQL Server 7.0 または SQL Server 2000 のユーザー データベースをアップグレードできます。ただし、次の制限事項が適用されます。

  • SQL Server 7.0 または SQL Server 2000 で作成した master データベース、model データベース、または msdb データベースのバックアップは、SQL Server 2005 にアタッチできません。
  • インデックス作成操作が書き込まれた SQL Server 7.0 のログ ファイルは、SQL Server 2000 および SQL Server 2005 のいずれにもアタッチできません。
ms189625.note(ja-jp,SQL.90).gif重要 :
SQL Server 6.5 以前を使用して作成したデータベースのバックアップは、形式に互換性がないので、SQL Server 2005 にアタッチできません。
  • レプリケートされたデータベースをアタッチする際に、そのデータベースがデタッチではなくコピーされたものである場合は、次の点を考慮してください。
    • 同じサーバー インスタンスのアップグレードされたバージョンにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_vupgrade_replication を実行してレプリケーションをアップグレードする必要があります。詳細については、「sp_vupgrade_replication (Transact-SQL)」を参照してください。
    • バージョンに関係なく別のサーバー インスタンスにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_removedbreplication を実行してレプリケーションを削除する必要があります。詳細については、「sp_removedbreplication (Transact-SQL)」を参照してください。

SQL Server 2005 にアップグレードするデータベースに対して APPLYPIVOTTABLESAMPLE、または UNPIVOT キーワードを使用している場合は、データベースの互換性レベルを 90 に設定する必要があります。データベースの互換性レベルを設定するには、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

ms189625.note(ja-jp,SQL.90).gif重要 :
SQL Server 2000 Service Pack 3 (SP3) 以降のバージョンの SQL Server では、アタッチとデタッチを行うと、そのデータベースの cross db ownership chaining オプションが 0 に設定され、複数データベースの組み合わせ所有権が無効になります。組み合わせ所有権の有効化の詳細については、「cross db ownership chaining オプション」を参照してください。

手順

デタッチとアタッチを使用してデータベースをアップグレードするには

  1. sp_detach_db ストアド プロシージャを使用して、SQL Server 7.0 または SQL Server 2000 のインスタンスからデータベースをデタッチします。

    詳細については、各バージョンの SQL Server Books Online を参照してください。

    ms189625.note(ja-jp,SQL.90).gifメモ :
    SQL Server 2005 では、このストアド プロシージャに新しいオプションが追加されています。詳細については、「sp_detach_db (Transact-SQL)」を参照してください。
  2. 必要に応じて、デタッチされたデータベース ファイルとログ ファイルを移動します。

    新しいログ ファイルを作成する場合であっても、ログ ファイルをデータ ファイルと一緒に移動する必要があります。場合によっては、データベースの再アタッチに既存のログ ファイルが必要になります。したがって、デタッチしたログ ファイルを使わずにデータベースを正常にアタッチできるまで、デタッチしたログ ファイルは必ずすべて保管しておいてください。

    ms189625.note(ja-jp,SQL.90).gifメモ :
    ログ ファイルを指定せずにデータベースのアタッチを試みると、アタッチ操作は元の場所でログ ファイルを検索します。元の場所にログの元のコピーが依然として存在する場合は、そのコピーがアタッチされます。元のログ ファイルが使用されないようにするには、新しいログ ファイルのパスを指定するか、ログ ファイルの元のコピーを (新しい場所にコピーした後で) 削除します。
  3. FOR ATTACH オプションまたは FOR ATTACH_REBUILD_LOG オプションを指定した CREATE DATABASE ステートメントを使用して、コピーしたファイルを SQL Server 2005 のインスタンスにアタッチします。

    ms189625.note(ja-jp,SQL.90).gifメモ :
    オブジェクト エクスプローラを使用して SQL Server 2005 データベースをアタッチする方法の詳細については、「データベースをアタッチする方法 (SQL Server Management Studio)」を参照してください。
  4. アップグレードされたデータベースで DBCC UPDATEUSAGE を実行することをお勧めします。

    以前のバージョンの SQL Server では、テーブルおよびインデックスの行やページのカウント値が正しくならないことがありました。このため、SQL Server 2005 より前のバージョンで作成したデータベースには誤ったカウントが含まれている場合があります。データベースを SQL Server 2005 にアップグレードした後、DBCC UPDATEUSAGE を実行して無効なカウントを修正することをお勧めします。この DBCC ステートメントを実行すると、テーブルまたはインデックスのパーティションごとに、行、使用ページ、予約済みページ、リーフ ページ、およびデータ ページの数が修正されます。詳細については、「DBCC UPDATEUSAGE (Transact-SQL)」を参照してください。

  5. (データベースを移動するのではなく) データベースのコピーを作成している場合、必要に応じて、SQL Server 7.0 または SQL Server 2000 のインスタンスで sp_attach_db ストアド プロシージャまたは sp_attach_single_file_db ストアド プロシージャを使用して、元のデータベースを再アタッチできます。

    詳細については、各バージョンの SQL Server Books Online を参照してください。

アップグレードされたサーバー インスタンスでのメタデータの管理

データベースを別のサーバー インスタンスにアタッチするときは、ユーザーおよびアプリケーションに一貫した使用環境を提供するために、アタッチ先のサーバー インスタンスで、ログイン、ジョブ、権限などのデータベースのメタデータの一部またはすべてを作成し直す必要が生じる場合があります。詳細については、「データベースを別のサーバー インスタンスで使用できるようにするときのメタデータの管理」を参照してください。

次の例では、Transact-SQL ステートメントを使用して SQL Server 2000 pubs データベースをデタッチおよびアタッチし、SQL Server 2005 データベースにアップグレードします。

  1. pubs がアタッチされているサーバー インスタンスに SQL Server 2000 クエリ アナライザを接続し、sp_detach_db ストアド プロシージャを使用してこのデータベースをデタッチします。

    USE master;
    GO
    EXEC sp_detach_db @dbname = N'pubs';
    GO
    
  2. この例の目的に従い、任意の方法で、pubs ファイル (pubs.mdf と pubs_log.ldf) を C:\Program Files\Microsoft SQL Server\MSSQL\Data\ (SQL Server 2000 の pubs の既定の場所) から C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\ (SQL Server 2005 データ ディレクトリ) にコピーします。

    ms189625.note(ja-jp,SQL.90).gif重要 :
    実稼働データベースの場合は、データベースとトランザクション ログを別のディスクに配置します。
    ms189625.note(ja-jp,SQL.90).gifメモ :
    ファイルをネットワーク経由でリモート コンピュータのディスクにコピーするには、そのリモート コンピュータの UNC (Universal Naming Convention) 名を使用します。UNC 名の形式は、\\Servername\Sharename\Path\Filename です。ローカル ハード ディスクにファイルを書き込む場合、SQL Server で使用するユーザー アカウントは、リモート ディスクのファイルに対して読み取りまたは書き込みを行うために必要な権限を持っている必要があります。
  3. コピーした pubs データベースと、必要に応じてログ ファイルを SQL Server 2005 のインスタンスにアタッチします (この例では同一のデータベース名を使用しています)。SQL Server Management Studio のクエリ エディタで新しいクエリを開き、データベースをアタッチするサーバー インスタンスに接続します。

    ms189625.note(ja-jp,SQL.90).gifメモ :
    詳細については、「SQL Server Management Studio の Transact SQL クエリ」を参照してください。

    次の CREATE DATABASE ステートメントを実行します。

    USE master;
    GO
    CREATE DATABASE pubs ON PRIMARY 
       (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\pubs.mdf')
       LOG ON (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\pubs_log.ldf')
       FOR ATTACH;
    GO
    
    ms189625.note(ja-jp,SQL.90).gifメモ :
    SQL Server Management Studio では、新しくアタッチされたデータベースはオブジェクト エクスプローラにすぐに表示されません。このデータベースを表示するには、オブジェクト エクスプローラで [表示] メニューの [最新の情報に更新] をクリックします。[データベース] ノードを展開すると、新しくアタッチしたデータベースがデータベースの一覧に表示されるようになります。
  4. 必要に応じて、sp_attach_db ストアド プロシージャを使用して、元の pubs データベースを SQL Server 2000 のインスタンスに再アタッチします。クエリ アナライザで次のように入力します。

    USE master;
    Go
    EXEC sp_attach_db @dbname = N'pubs', 
       @filename1 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', 
       @filename2 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf';
    GO
    

参照

処理手順

データベースをアタッチする方法 (SQL Server Management Studio)
データベース コピー ウィザードにより SQL Server 2005 をアップグレードする方法

概念

データベースのデタッチとアタッチ
データ ファイルとログ ファイルのセキュリティ保護

その他の技術情報

CREATE DATABASE (Transact-SQL)
アップグレード アドバイザを使用したアップグレードの準備

ヘルプおよび情報

SQL Server 2005 の参考資料の入手