3

这是一件很简单的事情,即使在这里问也让我感到很愚蠢,但是因为我已经被困了很长时间,所以我会在这里问它。我正在 Visual Studio 中开发数据层应用程序。我有一些常用的东西,比如表格、存储的过程和一些部署后的数据。默认情况下,数据层应用程序附带 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

问题是上面的代码不起作用。出于某种原因,部署命令只是忽略路径并在 Scripts/Post-Deployment 中而不是在适当的子文件夹中查找 States.sql 和 Logins.sql。其他人遇到过类似的事情吗?非常简单的问题,但要我永远解决这个问题。我已尽力解释,但提出问题,我可以尝试使事情更清楚。谢谢!

4

3 回答 3

6

我看了你的示例代码。当我试图重现这一点时,我在 Visual Studio 2010 中使用了一个 SQL 2008 数据库项目,但你的项目是一个数据层应用程序,这是非常不同的;当我切换到使用数据层应用程序时,我能够重现您所看到的内容。

数据层应用程序生成包含对象定义的 DAC 包,还包含用户定义的脚本,例如部署前和部署后脚本。现在,我不是 100% 确定(我之前没有使用过 DAC 包,所以我是基于观察和研究),但我猜测 DAC 包的文件结构不支持子- Script\Post-deployment 文件夹下的文件夹;我假设它在内部有一个非常严格的文件夹结构。因此,DACCompiler 似乎旨在仅从部署后脚本中的文件引用中删除文件名,并忽略目录路径。

这里有一份关于数据层应用程序的白皮书。其中有一节介绍如何将部署后脚本添加到包中,该节中有一些最佳实践,包括以下内容:

• 在解决方案资源管理器中工作时,建议您在 Script.PostDeployment.sql 脚本文件中包含所有部署后命令。这是因为 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 回答