5

私が解決したい問題は、ビルド構成に応じて異なるスクリプトをビルドすることです。

SQL Server の 2 つのインスタンスがあるとします。

  • リンクサーバーが接続されたエンタープライズ版
  • オフライン開発および単体テスト用の LocalDb バージョン

エンタープライズ バージョンには、LocalDB がこれらのビューをローカル テーブルに置き換えるときに、リンクされたサーバーのビューがあります。

これらのリンク サーバー ビューとローカル テーブルは、同じ名前と一連のフィールドを持ちます。そのため、デフォルトではビルドに含まれません (ビルド アクション = なし)。代わりに、プロジェクト ファイルの BeforeBuild ターゲットのビルドに含まれます。

<Target Name="BeforeBuild">

    <ItemGroup Condition=" '$(Configuration)' == 'LocalDb'">
        <Build Include="Local_Tables\*.sql" />
    </ItemGroup> 

    <ItemGroup Condition=" '$(Configuration)' != 'LocalDb' ">
        <Build Include="Linked_Server_Views\*.sql" />
    </ItemGroup>

</Target>

しかし、問題は、Visual Studio が DB モデルをキャッシュすることです。最初に LocalDb 用のプロジェクトをビルドしてから、Enterprise 構成用のプロジェクトをビルドしようとすると、Visual Studio はエラーを出力します。

エラー: SQL71508: モデルには既に同じ名前の要素があります

ソリューションを閉じて開くか、プロジェクトをアンロードしてプロジェクトを再ロードすると、Visual Studio は dbmdl ファイルを再作成し、エンタープライズ構成はエラーなしでビルドされます。

したがって、dbmdl キャッシュを更新すると、エラーなしでスムーズにビルドできると思います。


Visual Studio 2012 で SQL Server データベース プロジェクトを開くか再読み込みすると、拡張子dbmdlのファイルが作成されます。これは、ここで説明されているように、逆シリアル化されキャッシュされた db モデルです。

dbmdl ファイルの再作成の瞬間に、Visual Studio は次のように出力します。

Deserializing the project state for project 'MyProject.sqlproj'...
Detecting file changes for project 'MyProject.sqlproj'...
Deserialization has been completed for project 'MyProject.sqlproj'.

プロジェクトをリロードせず、プロジェクト xml ファイルを変更せずに、Visual Studio に強制的に dbmdl キャッシュを更新させる方法は?

プロジェクト xml ファイルの BeforeBuild または AfterBuild ターゲットにコマンドを配置して、dbmdl キャッシュを更新する方法はありますか?

または、問題へのアプローチ全体が間違っていて、ビルド構成に応じて異なるスクリプトを作成する別の方法がありますか?

4

2 に答える 2

1

私はこれと、SSDT でそれを処理する最良の方法について考えていました。おそらく「最善の」方法はありませんが、変更を公開する前に正しいバージョンを判断できる場合は、次のことを検討します。

  1. リンク サーバーの有無にかかわらず、エディションごとに発行プロファイルを作成します。
  2. リンクされたサーバー名を保持する変数を作成します。これには、データベースも含まれる可能性があるため、「[サーバー].[データベース]」のようになります。
  3. リンク サーバー ビューの配置後スクリプトを作成します。これらには、アクセス許可、リンク サーバー名の変数などを含める必要があります。
  4. デプロイ後のスクリプトで、「edition」変数をクエリします。リンク サーバーを使用する場合は、プロジェクト内のリンクされていないネイティブ サーバー ビューをドロップ/再作成して、リンク サーバー上のビューを使用します。または、変数をローカル ビューの空の文字列に設定し、リンク サーバーのサーバー/DB に設定すると、おそらく 1 つのコード セットを使用できます。

これには、ビューのコード チェックができないという欠点がありますが、それらのリンク サーバー ビューを格納する場所と、それらを展開する場所が 1 か所得られます。SSDT に変更を処理させるのではなく、ドロップ/作成でリリースする必要があります。つまり、発行アクションごとに変更が再作成されます。しかし、それはあなたが求めている解決策を提供するかもしれないと思います。

于 2013-05-10T17:32:48.193 に答える