Share via


方法: データベース スキーマを比較する

更新 : 2010 年 7 月

このトピックの内容は、次の製品に該当します。

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional 

Visual Studio Express

トピック該当 トピック該当 トピック該当なし トピック該当なし

Visual Studio Premium または Visual Studio Ultimate を使用して、2 つのデータベース スキーマを比較できます。 スキーマは、データベース、データ層アプリケーション プロジェクト、データベース プロジェクト、またはデータベース プロジェクト (.dbschema ファイル) からのビルド出力によって表現されます。 比較するエンティティは、ソースおよびターゲットと呼ばれます。 スキーマの比較が終了すると、[スキーマ比較] ウィンドウに結果が表示されます。 また、異なるスキーマの同期に使用できるデータ定義言語 (DDL: Data Definition Language) スクリプトも、Visual Studio によって生成されます。

ターゲット データベースに対してデータベース プロジェクトの比較を反復して実行する予定がある場合、データベース プロジェクトにスキーマ比較を追加できます。 同じ比較を開き直すことで、スキーマを比較し直すことができます。 スキーマ比較を保存すると、接続情報、セッション固有のオプション、および SQLCMD 変数の値が保存されます。 結果は保存されません。保存したスキーマ比較の .scmp ファイルを開くと、結果は再生成されます。

比較が終了すると、次のように他の手順を実行できます。

  • 2 つのデータベース間の構造的な相違点を確認できます。 詳細については、「スキーマの相違点の表示」を参照してください。

  • [更新スクリプトの更新] をクリックすると、スキーマの同期に使用されるスクリプト全体をいつでも確認できます。

  • ターゲットの一部またはすべてを、ソースと一致するように更新することができます。 詳細については、「データベース オブジェクトまたはサーバー オブジェクトの同期」を参照してください。

  • ターゲットおよびソースに常駐するデータを比較することができます。 詳細については、「方法: 2 つのデータベースのデータを比較して同期させる」を参照してください。

スキーマ比較シナリオの詳細については、「データベース スキーマの比較と同期」を参照してください。

VSDBCMD.EXE を使用して、コマンド プロンプトから .dbschema ファイルを比較することもできます。 この方法を使用すると、たとえば、ターゲット サーバーに直接アクセスできない場合に、ターゲット データベースを更新するための更新スクリプトを生成できます。

このトピックの内容

スキーマ比較を使用して 2 つのスキーマを比較するには

  1. 2 つのスキーマを比較し、データベース プロジェクトの一部として比較設定を保存しない場合、次の手順を実行します。

    1. [データ] メニューを開き、[スキーマ比較] をポイントし、[新しいスキーマ比較] をクリックします。

    2. 手順 3. に進みます。

  2. 2 つのスキーマを比較し、データベース プロジェクトの一部として比較設定を保存する場合、次の手順を実行します。

    1. ソリューション エクスプローラーで、[スキーマ比較] フォルダーを右クリックし、[追加] をポイントして、[スキーマ比較] をクリックします。

      [新しい項目の追加] ダイアログ ボックスが表示されます。

    2. [名前] に、スキーマ比較に付ける名前を入力し、[追加] をクリックします。

  3. 比較するソースとターゲットを指定するには、各スキーマの [プロジェクト][データベース]、またはデータベース スキーマ ファイルをクリックします。

    注意

    ターゲット スキーマのデータベース スキーマ ファイルを指定できますが、更新はできません。 サポートされている比較シナリオの一覧については、「データベース スキーマの比較と同期」を参照してください。

  4. ソースまたはターゲットについて [データベース] をクリックした場合は、一覧でそのデータベースをクリックするとデータ ソースに接続します。

    データベースが一覧にない場合は、[新しい接続] をクリックします。 [接続のプロパティ] ダイアログ ボックスで、ソースまたはターゲットが常駐するサーバーの名前、および接続するときに使用する認証の種類を指定します。 オプションで、そのサーバー上のデータベースをクリックします。 終了したら、[OK] をクリックします。

    注意

    接続が確立されると、サーバー エクスプローラー[データ接続] の下にその接続が表示されます。

  5. ソースまたはターゲットのデータベース スキーマ ファイルをクリックした場合、パスとファイル名を入力するか、[参照] をクリックしてファイルを指定します。

  6. (省略可能)[オプション] をクリックし、比較するオブジェクト、無視する相違点の種類、および生成する更新スクリプトに含める内容を指定します。

    重要

    既定で、[スキーマ比較] セッションには、[ツール] メニューを開き、[オプション] をクリックして構成したオプションが使用されます。 拡張プロパティを無視しない場合、[オプション] をクリックして対応する設定を変更します。 [スキーマ比較] の設定オプションの詳細については、「方法 : データベース スキーマの比較に関するオプションを設定する」を参照してください。

  7. (省略可能)[SQLCMD 変数] をクリックし、変数とその値の一覧を含む .sqlcmdvars ファイルを指定します。

    注意

    SQLCMD 変数を指定できるのは、2 つのプロジェクト (データベース プロジェクト、サーバー プロジェクト、またはデータ層アプリケーション プロジェクト) を比較する場合のみです。

    スキーマを比較すると、対応するデータベース プロジェクトの値が置き換えられます。

  8. [OK] をクリックします。

    スキーマ比較が開始されます。

    注意

    進行中の比較を停止するには、ツール バーの [停止] をクリックします。

Visual Studio オートメーション モデルを使用してスキーマを比較するには

  1. [表示] メニューを開き、[その他のウィンドウ] をポイントし、[コマンド ウィンドウ] をクリックします。

  2. コマンド ウィンドウで、次のコマンドを入力します。

    Data.NewSchemaComparison sourceIdentifier targetIdentifier
    

    sourceIdentifier を次のいずれかに置き換えます。

    • /ProviderType ConnectionBased /ConnectionString "<接続文字列>"

    • /ProviderType ConnectionBased /ConnectionName <接続名>

    • /ProviderType ProjectBased /ProjectName <ファイル名>.dbproj

    • /ProviderType FileBased /ProjectName <ファイル名>.dbschema

    • /ProviderType FileBased /ProjectName <ファイル名>.dacpac

    targetIdentifier を次のいずれかに置き換えます。

    • /ProviderType ConnectionBased /ConnectionString "<接続文字列>"

    • /ProviderType ConnectionBased /ConnectionName <接続名>

    • /ProviderType ProjectBased /ProjectName <ファイル名>.dbproj

    • /ProviderType FileBased /ProjectName <ファイル名>.dbschema

    • /ProviderType FileBased /ProjectName <ファイル名>.dacpac

    ソースとターゲットを指定しない場合は、[新しいスキーマ比較] ダイアログ ボックスが表示されます。 Data.NewSchemaComparison コマンドのパラメーターの詳細については、「Visual Studio のデータベース機能のオートメーション コマンド リファレンス」を参照してください。

    指定したソースとターゲットのオブジェクトと設定が比較されます。 結果が [スキーマ比較] セッションに表示されます。結果は必要に応じて保存できます。 結果の表示方法またはスキーマの同期方法の詳細については、「スキーマの相違点の表示」および「データベース オブジェクトまたはサーバー オブジェクトの同期」を参照してください。

初めてスキーマを保存するには

  1. [ファイル] メニューの [SchemaComparisonName.scmp の保存] をクリックします。

    [名前を付けてファイルを保存] ダイアログ ボックスが表示されます。

  2. スキーマ比較のパスとファイル名を指定します。

    比較がデータベース プロジェクトに含まれる場合、そのプロジェクトの SchemaComparisons に比較が保存されます。

  3. [保存] をクリックします。

    スキーマ比較は指定した場所に保存されます。

スキーマの相違点の表示

ソース スキーマとターゲット スキーマを比較し、[スキーマ比較] ウィンドウのツリーに結果を表示することで、相違点を確認できます。 たとえば、ソースには存在してターゲットには存在しないオブジェクトのみを表示できます。 また、特定のオブジェクトの相違点について詳細を表示し、結果を更新して最新の変更を反映することもできます。

ソースに合わせてターゲットを同期するスクリプトの Transact-SQL コマンドとして、結果を表示することもできます。 このスクリプトは [スキーマ更新スクリプト] ウィンドウまたは Transact-SQL エディターに表示できます。また、スクリプトをファイルにエクスポートすることもできます。 ソースに合わせてターゲットを更新する場合、このスクリプトをそのまま実行してスキーマを同期できます。また、スクリプトを変更して実行することもできます。 詳細については、「データベース オブジェクトまたはサーバー オブジェクトの同期」を参照してください。

結果を種類でフィルターするには

  1. [スキーマ比較] ツール バーの [フィルター] をクリックします。

  2. 表示する結果の内容を指定するフィルターを 1 つまたは複数クリックします。

    注意

    フィルター設定は .scmp ファイルに保存され、ソース スキーマとターゲット スキーマを変更するときまで存続します。

オブジェクト定義内の変更を表示するには

  • ステータスが "新規"、"見つかりません"、"異なる定義" のグリッドの行をクリックします。

比較結果を更新するには

  • [スキーマ比較] ツール バーの [最新の情報に更新] をクリックします。

    ソースとターゲットを再比較すると、比較結果は更新されます。

同期スクリプトを表示するには

  • [データ] メニューの [スキーマ比較] をポイントし、[スキーマ更新スクリプトの表示] をクリックします。

    注意

    [スキーマ更新スクリプトの表示] を使用できない場合、指定したターゲットのスクリプトを生成できないか、比較を更新する必要があることを示します。 たとえば、ターゲット スキーマが .dbschema ファイルの場合、更新スクリプトを作成できません。

    [スキーマ更新スクリプト] ウィンドウには、ソースに合わせてターゲットを更新するために使用できるスクリプトが表示されます。

    注意

    [スキーマ更新スクリプト] ウィンドウが開いている場合、[スキーマ更新スクリプトの更新] をクリックできます。

Transact-SQL エディターで同期スクリプトを開くには

  • [データ] メニューの [スキーマ比較] をポイントし、[エクスポート先] をポイントし、[エディター] をクリックします。

    Transact-SQL エディターには、ソースに合わせてターゲットを更新するために使用できるスクリプトが表示されます。

ファイルの同期スクリプトを保存するには

  1. [データ] メニューの [スキーマ比較] をポイントし、[エクスポート先] をポイントし、[ファイル] をクリックします。

    [スキーマ更新スクリプトの保存] ダイアログ ボックスが表示されます。

  2. [オブジェクト名] に、同期スクリプトの名前を入力し、[保存] をクリックします。

    スクリプトは指定した名前のファイルに保存されます。

データベース オブジェクトまたはサーバー オブジェクトの同期

ソースおよびターゲットのスキーマを比較した後、スキーマ全体、またはそのスキーマ内で指定したデータベース オブジェクトのみを同期できます。 詳細については、「データベース スキーマの比較と同期」を参照してください。

ソースとターゲットの両方が同じサーバー上にある場合、スキーマを同期しようとするとエラーが発生することがあります。 エラーが発生する理由は、サーバー上に同じ名前のソース ファイルがあり、ファイル グループ ファイルなどのターゲット ファイルをソースと同じ名前で作成できないためです。 この問題を解決するには、競合するファイルについて [更新アクション][スキップ] に変更します。

注意

比較するデータベースは、ソースおよびターゲットと呼ばれます。 データベース スキーマを同期する場合は、ターゲットを更新し、ソースはそのままにしておきます。 プロジェクト ファイル (.dbschema) をターゲットに指定することはできますが、プロジェクト ファイルは更新できません。

ターゲット スキーマを更新するには

  1. 2 つのスキーマを比較します。

    比較が終了すると、比較したデータベース オブジェクトが [スキーマ比較] ウィンドウに表示されます。 各行は、1 つのデータベース オブジェクトを表します。

  2. (省略可能) [更新アクション] 列で、結果リストの各オブジェクトに対して更新を適用するかスキップするかを指定します。

    個別の同期アクションは、直ちに実行されるのではなく、次の手順でのバッチ実行用に保存されます。

    注意

    特定の種類のオブジェクトすべてに対する [更新アクション] 列をリセットするには、その種類のノード (テーブル ノードなど) を右クリックし、[既定値の復元] をクリックします。 特定の種類のすべてのオブジェクトについて [更新アクション] 列を特定の状態に設定するには、その種類のノードを右クリックし、[すべて作成][すべて更新]、または [すべてスキップ] をクリックします。

  3. 異なるデータベース オブジェクト、不足しているデータベース オブジェクト、または新しいデータベース オブジェクトを同期するには、次のいずれかの操作を実行します。

    • ターゲットを直ちに更新するには、[更新の書き込み] をクリックします。

      [スキップ] とマークされているオブジェクトを除き、この選択は、ターゲットの対応するオブジェクトで、ソースの選択されたデータベース オブジェクトのスキーマを適用します。 この同期は、ターゲット オブジェクトの更新、作成、または削除を意味します。

      重要

      スキーマを更新している途中で [ターゲットへの書き込みの停止] をクリックすると、操作を取り消すことができます。 更新を中止した場合、ほとんどのオブジェクト型について変更は反映されません。 ただし、ユーザーおよび役割オブジェクトはトランザクションでラップされないため、これらのオブジェクトに対する一部の変更は、ロールバックできない可能性があります。

    • ターゲットを更新する前に変更を確認するには、[スキーマ更新スクリプト] ウィンドウを使用するか、[エディターにエクスポート] をクリックします。

      この選択操作で Transact-SQL スクリプトが生成され、Transact-SQL エディター ウィンドウに表示されます。 スクリプトを確認し、必要に応じて変更してから、ターゲットに対して実行できます。 生成された Transact-SQL スクリプトは、[更新の書き込み] をクリックした場合に実行されるスクリプトと一致します。

      注意

      Visual Studio では、更新の書き込み アクションが完了した後、[スキーマ比較] ウィンドウに表示される結果が自動的に更新されることはありません。 代わりに、ステータス バーが更新されて、[最新の情報に更新] をクリックしたことが示されます。 この動作により、スキーマの比較 (スキーマが大きい場合に時間がかかるアクション) を再び選択できます。

    • Transact-SQL エディターに表示せずに変更をファイルに保存するには、[ファイルにエクスポート] をクリックします。

      この選択操作で Transact-SQL スクリプトが生成され、指定したファイル名に保存されます。 生成されたスクリプトは、[更新の書き込み] をクリックした場合に実行されるスクリプトと一致します。 自分が作成したスクリプトを別のユーザーが後で使用してターゲットを更新する場合、または別のユーザーが作成したスクリプトを更新する必要がある場合に、この方法を利用できます。

VSDBCMD.EXE によるスキーマの比較

アクセスできないデータベースの配置スクリプトを生成することができます。 そのためには、VSDBCMD.EXE を使用します。この場合、配置するプロジェクトの .dbschema ファイルと、ターゲット データベースの現在の状態を表す .dbschema が必要です。 ターゲット スキーマがない場合は、データベース管理者に依頼してターゲット スキーマをインポートしてもらうことができます。インポートの方法については、このセクションの 2 つ目の手順を参照してください。

以下の手順はどちらも、VSDBCMD.EXE ツールとサポート ファイルがある任意のコンピューターで実行できます。 必要なファイルはすべて、%PROGRAM FILES%\Microsoft Visual Studio 10.0\VSTSDB\Deploy フォルダーとそのサブフォルダーに含まれています。 詳細については、「VSDBCMD.EXE コマンド ライン リファレンス (配置およびスキーマのインポート)」を参照してください。

コマンド プロンプトからスキーマを比較するには

  1. コマンド プロンプトを開きます。

  2. VSDBCMD.EXE を含むフォルダーに移動します。

  3. コマンド プロンプトで、「vsdbcmd.exe /a:deploy /dd:- /dsp:sql /model:ProjectName.dbschema /targetmodelfile:TargetDatabase.dbschema /DeploymentScriptFile:OutputFilename.sql /p:TargetDatabase="TargetDatabaseName"」と入力します。

    ProjectName を、データベース プロジェクトをビルドして作成した .dbschema ファイルの名前に置き換えます。 TargetDatabase を、ターゲット データベースのスキーマを含む .dbschema ファイルの名前に置き換えます。 OutputFilename を、配置スクリプトに使用する名前に置き換えます。 TargetDatabaseName を、更新するデータベースの名前に置き換えます。

    注意

    データベース プロジェクトの配置前スクリプトと配置後スクリプトを含める場合は、このコマンド ラインに /ManifestFile:ProjectName.deploymanifest というパラメーターを追加します。 .deploymanifest ファイルは、プロジェクト フォルダー内の sql フォルダーのサブフォルダーにあります。

  4. OutputFilename.sql ファイルを使用してターゲット サーバーに更新を配置できます。その作業をデータベース管理者に依頼することもできます。

ターゲット スキーマをインポートするには

  1. コマンド プロンプトを開きます。

  2. VSDBCMD.EXE を含むフォルダーを参照します。

  3. コマンド プロンプトで、「vsdbcmd.exe /a:Import /dsp:sql /model:TargetDatabase.dbschema /cs:ConnectionString」と入力します。

    TargetDatabase を、ターゲット データベースからインポートする .dbschema ファイルの名前に置き換えます。 ConnectionString を、ターゲット データベースへの接続文字列に置き換えます。 たとえば、/cs:"Data Source=MyServer/SQL2K8;Integrated Security=True;Pooling=False;Initial Catalog=MyDatabase" と指定します。

    このコマンドが完了すると、.dbschema ファイルが作成されます。 そのファイルに、インポート元データベースのスキーマ定義が含まれています。 詳細については、「方法: コマンド プロンプトからスキーマをインポートする」および「VSDBCMD.EXE コマンド ライン リファレンス (配置およびスキーマのインポート)」を参照してください。

参照

処理手順

方法: 2 つのデータベースのデータを比較して同期させる

概念

データベース スキーマの比較と同期

履歴の変更

日付

履歴

理由

2010 年 7 月

VSDBCMD.EXE を使用してコマンド プロンプトからスキーマを比較する方法の説明を追加しました。

カスタマー フィードバック