web-dev-qa-db-ja.com

SSDTプロジェクトで、アセンブリの再配置を回避する方法は?

いくつかのsql clr要素を持つSSDTプロジェクトがあります。それらが変更されることはほとんどありませんが、dbプロジェクトを再デプロイするたびに、アセンブリを削除して再作成する必要があると判断します。

それを続けるのは少しもったいないと思います。とにかく、関連付けられたC#sprocを実際に変更したときにのみアセンブリを再作成するように構成できますか?

これが役立つ場合、変更スクリプトの生成に使用しているプロファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>#{DatabaseName}</TargetDatabaseName>
    <DeployScriptFileName>#{DatabaseScriptName}</DeployScriptFileName>
    <TargetConnectionString>Data Source=#{DatabaseServer}</TargetConnectionString>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <ScriptDatabaseOptions>True</ScriptDatabaseOptions>
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
    <GenerateSmartDefaults>True</GenerateSmartDefaults>
  </PropertyGroup>
</Project>

タコを使って展開しています。

3
Michael B

Visual Studio 2013でスキーマ比較ツールを使用するときにも同じ問題が発生します。SQLCLRアセンブリの展開を継続したい理由は、DLLのモジュールバージョンID(MVID)にあります。 MVIDは、コンパイル時にC#コンパイラによって自動的に生成されるガイドであるため、再構築するたびにDLL新しいMVIDを取得します。

1つのオプションは、DLLの再構築を試行して回避することです。 Visual Studioを使用してローカルでビルドする場合は、「クリーン」および「リビルド」オプションを回避する必要があります。 TFSなどのビルドサーバーを使用している場合は、ワークスペースをクリーンアップしないようにビルドを構成する必要があります。

もう1つの方法は、C#コードを別のプロジェクトに置き、C#コードが変更されたときにDLLをメインデータベースプロジェクトに「インポート」することです。以前のスタイルの「DataDude」プロジェクトを使用するときに使用していたのとほぼ同じです。 VS2013のSSDTの最新バージョンを使用して、SQLCLRアセンブリDLLをメインのSQL Serverプロジェクトの参照として追加し、 "Model Aware"プロパティを "True"に設定しました。これはストアプロシージャ/関数のDDLステートメントでアセンブリを参照するには、プロパティが必要なようです。

3
Recce