データ層アプリケーションのアップグレード

配置済みのデータ層アプリケーション (DAC) を新しいバージョンにアップグレードするプロセスは、スクリプトを使用してデータベースやデータベースの変更を配置するよりも簡単です。 データベース開発者は、新しいバージョンのスキーマとプロパティを記述した DAC パッケージを構築するだけです。 DAC アップグレード プロセスでは、新しいスキーマを既存の配置済みスキーマと比較した後、新しいスキーマに変更するために必要な操作を動的に実行します。

アップグレード プロセス

SQL Server のデータ層アプリケーションのアップグレード プロセスは、配置済みの DAC を同じアプリケーションの別のバージョンに変換します。 たとえば、Finance バージョン 1.0 から Finance バージョン 2.0 へのアップグレードに使用されます。 簡単な配置プロセスの手順を次に示します。

  • データベース開発者は、Finance バージョン 1.0 DAC の開発が完了した後、FinanceVersion1.dacpac DAC パッケージを構築します。

  • データベース管理者は、Finance 1.0 DAC を実稼働環境に配置します。 この時点で、データベース エンジンの実稼動インスタンスには、配置済みの DAC が含まれています。この DAC のアプリケーション名は Finance、バージョンは 1.0 で、Finance という名前の関連付けられたデータベースがあります。

  • 次に、データベース開発者は、次のバージョンの開発を開始し、開発が完了したら FinanceVersion2.dacpac を構築します。

  • データベース管理者は、DAC アップグレード プロセスを計画します。 Finance データベースをバックアップします。 運用データベースで問題が発生しないように、DAC パッケージの内容とアップグレードによって行われる操作のレポートを確認します。

  • その後、データベース管理者は、現在配置されているバージョン 1.0 DAC とバージョン 2.0 DAC パッケージの両方を指定して、DAC のアップグレードを実行します。 アップグレードを行うには 2 つの方法があります。

    • DAC の IncrementalUpgrade() メソッドを呼び出す Windows PowerShell スクリプトを使用して、インプレース アップグレードを実行します。 インプレース アップグレードは、既存のデータベースのスキーマを新しい DAC バージョンで定義されているスキーマに一致するように変更します。

    • DAC の Upgrade() メソッドまたはデータ層アプリケーションのアップグレード ウィザードを使用して、サイド バイ サイド アップグレードを実行します。 サイド バイ サイド アップグレードでは、新しいスキーマで新しいデータベースが作成され、データが元のデータベースから新しいデータベースに移行されます。

  • アップグレードの完了時点で、アップグレードされた DAC のアプリケーション名は Finance で、Finance という名前のデータベースが関連付けられていますが、DAC バージョンは 2.0 になります。

配置後のデータベースの変更

DAC のアップグレード以外のメカニズムを使用してデータベースに変更が加えられた場合、データベースは関連付けられた DAC から離れたと言います。 たとえば、CREATE TRIGGER ステートメントを使用して新しいトリガーを追加したり、ALTER TABLE ステートメントを使用してテーブルの構造を変更したりした場合です。 変更の種類によっては、指定されたアップグレード オプションに応じて、DAC のアップグレード プロセスを完了できない場合があります。 変更はアップグレード後のデータベースにも保持されません。

DAC のアップグレード操作では、現在のデータベースのスキーマと msdb システム データベースに格納された DAC の定義の相違点のチェックが実行されます。 相違点が検出されると、相違点の一覧を示す警告ダイアログが表示されます。 レポートされた相違点を分析し、アップグレードで転送できなくても新しいシステムに必要なオブジェクトやデータを転送するためのプロセスまたはスクリプトを配置した後にのみ、アップグレードを続行してください。

アップグレードの完了後、データベースには、DAC の新しいバージョンで定義された、新しい DAC に指定された形式のすべてのオブジェクトが格納されています。 ほとんどの場合、これは、新しいバージョンの DAC とデータベースに関連付けられたアプリケーションのバージョンに必要な形式となります。 アップグレードの変更レポートを分析する際は注意して、新しいシステムに必要なオブジェクトのみを転送してください。 たとえば、現在の DAC およびデータベースに存在する複数のオブジェクトが新しい DAC に存在しない場合、エラーにならないことがあります。 このようなオブジェクトは、DAC を使用するアプリケーションの新しいバージョンで削除または再設計された機能に関連付けられている可能性があります。

インプレース アップグレードでは、変更されたオブジェクトは保持されません。 アップグレードを開始する前に、オブジェクト定義とデータを保存する必要があります。 サイド バイ サイド アップグレードでは、オブジェクトとデータは名前が変更された元のデータベースに保持されます。 変更されたすべてのオブジェクトを新しいデータベースに手動で転送する必要があります。

新しいデータベースに転送するオブジェクトのスクリプトを作成する方法のヒントの詳細については、「スクリプトを生成する方法 (SQL Server Management Studio)」を参照してください。

DAC プロジェクトでは、配置前や配置後のスクリプトを指定できます。 これらのスクリプトは、DAC でサポートされていないオブジェクトの作成などの操作を実行できる Transact-SQL スクリプトです。 元の DAC に DAC でサポートされていないオブジェクトを作成した配置後のスクリプトが含まれている場合は、インプレース アップグレード中にこれらのオブジェクトを削除できるようなメカニズムによってオブジェクトを個別にアップグレードするか、サイド バイ サイド アップグレードで元のデータベースにそのまま残しておく必要があります。

インプレース アップグレード

インプレース アップグレードでは、次の操作が実行されます。

  • 配置された DAC と DAC パッケージの両方でアプリケーション名が同じ (Finance など) であることが確認されます。 また、新しいバージョンの DAC でサーバーの選択ポリシーが定義されている場合は、そのポリシーに指定された要件がデータベース エンジンのインスタンスで満たされているかどうか、および既存のデータベースに DAC でサポートされていないオブジェクトが含まれているかどうかが評価されます。

  • CREATE、ALTER、DROP ステートメントなど、データベースのスキーマを新しいバージョンの DAC で定義されているスキーマと一致させるのに必要なすべての変更が実行されます。

[データ損失を無視する] オプションが True に設定されている場合、DAC のアップグレードはデータを削除する操作を実行する可能性があります。 たとえば、現在のデータベースにあるテーブルが新しい DAC のスキーマに存在しない場合は、アップグレードによってテーブルは削除されます。 操作を実行する前に、データベース管理者はアップグレード後に必要なデータをアーカイブする必要があります。

インプレース アップグレードは、SQL Azure およびデータベース エンジンのインスタンスの両方でサポートされています。 インプレース アップグレードでは、DAC フレームワーク 1.1 と新しい DAC アップグレード ウィザードが必要です。これらは、SQL Server 2008 R2 Service Pack 1 (SP1) に含まれています。

サイド バイ サイド アップグレード

サイド バイ サイド アップグレードは SQL Azure でサポートされておらず、次のバージョンの SQL Server でもサポートされない予定です。 アップグレードを行う場合は、SQL Server 2008 R2 SP1 に含まれているインプレース アップグレードを実行することをお勧めします。

サイド バイ サイド アップグレードでは、次の操作が実行されます。

  • 配置された DAC と DAC パッケージの両方でアプリケーション名が同じ (Finance など) であることが確認されます。 また、新しいバージョンの DAC でサーバーの選択ポリシーが定義されている場合は、そのポリシーに指定された要件がデータベース エンジンのインスタンスで満たされているかどうか、および既存のデータベースに DAC でサポートされていないオブジェクトが含まれているかどうかが評価されます。

  • 新しいバージョンの DAC が DAC パッケージから配置されます。 これにより、一時的な名前で新しいデータベースが作成されます。

  • 元のデータベースが読み取り専用モードでない場合は、読み取り専用に設定され、データが新しいデータベースにコピーされます。

  • 元のデータベースが読み取り専用モードの場合は、新しいデータベースが読み取り専用に設定されます。

  • 元のデータベース名は、データベース名の末尾に文字列が追加されて変更されます。

  • 新しいデータベースには、元のデータベース名が割り当てられます。

  • データベース管理者が新しいデータベースが正しく動作していることを確認した後、元のデータベースはアーカイブできます。

データベースの変更は、テーブル内のデータが新しいデータベースに転送されるかどうかに影響する場合があります。 テーブルは、データベースの変更に関して次のような状態になります。

  • テーブルの構造は、msdb 内の現在の DAC 定義、現在のデータベース、および新しい DAC という 3 つのすべての場所で同じです。 このテーブルは新しいデータベース内に存在し、アップグレード操作によってデータが新しいデータベースに転送されます。 転送は、古いテーブルの SELECT ステートメントに基づいた INSERT ステートメントを使用して行われます。

  • テーブルは現在の DAC 定義またはデータベース内には存在しませんが、新しい DAC で定義されています。 このテーブルは新しいデータベース内に存在しますが、転送する既存のデータがないため、データはありません。

  • テーブルは現在の DAC 定義には存在しませんが、現在のデータベースと新しい DAC には存在します。 このテーブルは新しいデータベース内に存在しますが、アップグレード操作によってデータは転送されません。 アップグレードの完了後に、データを手動で転送してください。

  • テーブルは現在の DAC 定義とデータベースには存在しますが、新しい DAC には存在しません。 このテーブルは、新しいデータベース内には存在しません。 新しいシステムでテーブルが必要な場合は、手動でテーブルを作成し、アップグレードの完了後にデータを転送します。

  • テーブルは 3 つのすべての場所に存在しますが、現在の DAC 定義とデータベース内のテーブルの構造は、新しい DAC 内のテーブルの構造とは異なります。 このテーブルは、新しい DAC で定義された構造で、新しいデータベース内に存在します。

    • テーブル名と列名が一致しない場合は、アップグレード操作でデータが転送されなかったことが報告されます。 アップグレードの完了後に、データを手動で転送してください。

    • テーブル名と列名が一致した場合は、データの転送が実行されます。 列のデータ型が変更されていて互換性がないと、INSERT ステートメントは失敗し、アップグレード プロセスはロールバックされます。

任意のメカニズムを使用して、新しいバージョンのテーブルにデータを転送できます。 古いバージョンのテーブルから選択する INSERT ステートメントを使用できます。 また、「一括データのインポートおよびエクスポート」で説明されている一括挿入方法のいずれかを使用することもできます。

変更履歴

変更内容

DAC フレームワーク 1.1 で導入されたインプレース アップグレードについて説明しました。 その他のトピックで重複する内容を削除しました。

SQL Server 2008 R2 SP1 では、DAC フレームワーク 1.1 と新しい DAC アップグレード ウィザードの両方が含まれ、インプレース アップグレードが完全にサポートされます。