3

ここで聞くのもバカバカしいほど簡単なことですが、ずっと悩んでいるのでここで質問させていただきます。私はビジュアルスタジオでデータ層アプリケーションに取り組んでいます。テーブル、ストアド プロシージャ、デプロイ後のデータなどの通常のものがあります。デフォルトでは、データ層アプリケーションには Scripts/Post-Deployment フォルダーが付属しています。このフォルダー内には、Script.PostDeployment.sql というファイルがあります。もう少し整理するために、Post-Deployment 内に StaticData および TestData としてフォルダーを作成しています。データ作成用の挿入ステートメントは、これらのフォルダー内にあります。したがって、この構造に基づいて、次のコードを Script.PostDeployment.sql に追加します。

    /*
Post-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be appended to the build script.       
 Use SQLCMD syntax to include a file in the post-deployment script.         
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the post-deployment script.       
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/

:r .\StaticData\States.sql
:r .\TestData\Logins.sql

問題は、上記のコードが機能しないことです。なんらかの理由で、デプロイ コマンドはパスを無視し、States.sql と Logins.sql を適切なサブフォルダーではなく Scripts/Post-Deployment で探します。他の誰かが似たようなことに遭遇しましたか? 非常に単純な問題ですが、これを回避するのに永遠にかかります。私は説明するために最善を尽くしましたが、質問をしてください。物事をより明確にしようとすることができます. ありがとう!

4

3 に答える 3

6

サンプルコードを拝見しました。これを再現しようとしたとき、私は Visual Studio 2010 で SQL 2008 データベース プロジェクトを使用していましたが、あなたのプロジェクトはデータ層アプリケーションであり、それは非常に異なっています。データ層アプリケーションの使用に切り替えたとき、表示されているものを再現できました。

データ層アプリケーションは、オブジェクトの定義を含む DAC パッケージを生成し、デプロイ前およびデプロイ後のスクリプトなどのユーザー定義スクリプトも含みます。今、私は 100% 確実ではありません (以前に DAC パッケージを使用したことがないので、これは観察と調査に基づいています)。 Script\Post-deployment フォルダーの下のフォルダー。内部的にかなり厳密なフォルダー構造を持っていると思います。したがって、DACCompiler は、配置後のスクリプトでファイル参照からファイル名だけを取り除くように設計されているように見え、ディレクトリ パスを無視します。

データ層アプリケーションに関するホワイトペーパーはこちらにあります。このセクションには、配置後スクリプトをパッケージに追加するセクションがあり、そのセクションには、次のようないくつかのベスト プラクティスがあります。

• ソリューション エクスプローラーで作業する場合は、展開後のすべてのコマンドを Script.PostDeployment.sql スクリプト ファイルに含めることをお勧めします。これは、配置後のファイルが 1 つだけ DAC パッケージに含まれているためです。つまり、複数のファイルを作成しないでください。

技術的には、それが :r コマンドの機能ですが、コマンドを手動でファイルに直接埋め込む方が簡単な場合があります。

これは単に DACCompiler の設計上のバグである可能性もあります。

以下のことをお勧めします。

  • 今のところ、スクリプトを Post-Deployment フォルダーの直下に移動するのが最も簡単な方法だと思います。サブディレクトリがないことを補うために、一意のわかりやすい名前を付けてください。
  • または、本当にサブディレクトリを保持したい場合は、ビルド前のコマンドをプロジェクトに追加します。ビルドを開始する前に、スクリプトをサブディレクトリから配置後のディレクトリにコピーします (スクリプトに一意のファイル名があることを確認する必要があります)。
  • これがバグまたは存在すべき機能であると思われる場合は、
    http://connect.microsoft.com/SQLServerにアクセスし 、製品チームが製品
    の将来のバージョンでこの問題に対処することをお勧めします。ここは、この種の推奨事項を作成するのに最適な場所です。フィードバックは製品チームに送られ、ユーザー コミュニティ全体がフィードバックに投票して重要度を高めることができ、製品チームはフィードバックに関する情報をあなたに返すことができるからです。

そしてもちろん、他の誰かが別の答えを持っているかどうかを確認することもできます。しかし、他の誰もまだ応答していない場合は、おそらく応答していないと思います。私は確かに私の掘り出し物で何も見つけられませんでした。

全体として、この情報がお役に立てば幸いです。今すぐ機能させる方法を提供できればと思いますが、最善の策は、現在の設計の制限内で機能し、Connect にフィードバックを投稿することだと思います。

幸運を。

于 2011-03-01T08:07:43.753 に答える
0

これはパイプラインで遅すぎて問題を解決できないと感じていますが、一見の価値があるかもしれません. dacpac 形式は、一連の xml ファイルと SQL スクリプトを含む単なる zip ファイルです。ファイルの拡張子を zip に変更すると、含まれているファイルにアクセスできるようになります。postdeploy.sql ファイルには、配置後スクリプトとそれが参照するその他のスクリプトの集約が含まれている必要があります。

于 2013-01-22T08:04:34.133 に答える
0

Visual Studio 2013 を使用してこれを試したところ、うまくいきました。

    IF ( '$(DeployType)' = 'Qualification' ) 
    BEGIN --Run scripts 
        PRINT 'Deploying Qualification Specific scripts.'     
        :r .\Qualification\"QualificationSpecificTestScript.sql"
    END 
    ELSE IF ( '$(DeployType)' = 'Production' ) 
    BEGIN --Run scripts 
        PRINT 'Deploying Production Specific scripts.' 
        :r .\Production\"ProductionSpecificTestScript.sql"
    END

内容はQualificationSpecificTestScript.sqlProductionSpecificScript.sql生成された配置後のスクリプトに挿入されます。

生成されたスクリプト ファイルは次のとおりです (関連するセクションのみ)。

     IF ( '$(DeployType)' = 'Qualification' ) 
     BEGIN --Run scripts 
        PRINT 'Deploying Qualification Specific scripts.'     
            begin transaction;
            PRINT 'IN QUALIFICATION ENVIRONMENT POST DEPLOYMENT SCRIPT'
            commit transaction;
     END
     ELSE IF ( '$(DeployType)' = 'Production' ) 
     BEGIN --Run scripts 
        PRINT 'Deploying Production Specific scripts.' 
            begin transaction;
            PRINT 'IN PRODUCTION ENVIRONMENT POST DEPLOYMENT SCRIPT'
            -- TODO:  Confirm this record should be deleted
            --DELETE TB_VariableName where Id = 9514
            commit transaction;
     END
于 2016-04-01T20:22:14.073 に答える