2011-02-27 124 views
3

这是一件很简单的事情,即使在这里问这个让我感到很蠢,但是由于我长期被困在这里,我会在这里问。我正在开发Visual Studio中的数据层应用程序。我有平常的东西,如表格,存储特效和一些部署后数据。默认情况下,数据层应用程序随附脚本/后期部署文件夹。在这个文件夹里有一个名为Script.PostDeployment.sql的文件。为了更有条理,我将部署后的文件夹创建为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 

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

+0

只是为了澄清几点:(1)你在使用Visual Studio的版本? (2)当你说部署命令不起作用时,你的意思是在Visual Studio的生成菜单上的部署命令? (3)你如何确定它忽略了路径 - 你是否在Output窗口看到了一些告诉你的东西,你在看它所创建的文件还是其他的东西? – 2011-02-27 23:11:44

+0

(1)Visual Studio 2010 Premium与SQL Server 2008 R2一起使用。 (2)是从构建菜单中执行“部署”命令。 (3)我知道visual studio忽略路径的方式是当我看着它显示的输出窗口时 - 错误:找不到文件'$ \ Scripts \ Post-Deployment \ States.sql'。 – 2011-02-28 01:19:08

+0

嗯。我没有经历过。它对我来说就像一个魅力,但我没有在这台机器上安装SQL 2008 R2;只是SQL Express和VS2010。让我们确保这是来自部署后脚本的导致错误的行。如果删除这些行,错误消失了吗?或者,如果您将States.sql和Logins.sql文件复制到部署后文件夹中,那么错误消失了吗? – 2011-02-28 06:39:06

回答

6

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

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

在数据层应用程序here上有白皮书。其中包括向包中添加后期部署脚本的一节,并在该部分中介绍了一些最佳实践,其中包括以下内容:

•当您在解决方案资源管理器中工作时,建议您包括所有后期处理脚本,部署命令在Script.PostDeployment.sql脚本文件中。这是因为DAC包中只包含一个后期部署文件。换句话说,你不应该创建多个文件。

现在,从技术上讲,这就是r命令的作用,但是您可能会发现将命令直接嵌入到文件中更容易。

这也可能只是DACCompiler设计中的一个错误。

这里是我建议你这样做:

  • 就目前而言,最简单的事情 - 我相信 - 仅仅是移动脚本 了直属部署后 文件夹;给他们独特的描述性的 名称来弥补没有 的子目录。
  • 或者,如果您真的想要 保留子目录,请将 预构建命令添加到您的项目; 有它的 构建开始前从 子目录中的脚本复制到 部署后的目录(你需要确保 脚本具有唯一的文件名)
  • 如果你觉得这是一个错误,或 功能,它应该存在,去
    http://connect.microsoft.com/SQLServer 和建议,产品团队
    地址就在 产品的未来版本。这是一个伟大的地方 使这些种类的建议, 因为反馈转到 产品团队,在 大可以反馈投票 用户群体增加其重量,产品 团队可以回到您沟通与 有关反馈的信息。

而且,当然,你可以坚持看看别人是否有不同的答案,如果有的话,太棒了!但我猜如果没有其他人回应,那么可能没有一个;我在挖掘中当然找不到任何东西。

我希望整体这个信息是有帮助的。我希望我能给你一种现在可以使用的方式,但我认为你最好的选择是在当前设计的限制内工作,并向Connect发布反馈。

祝你好运。

+0

@ matthew-burr感谢您关注此事。 – 2011-03-01 14:32:45

0

我有一种感觉,这将是为时已晚,以帮助解决您的问题,但它可能值得一看。 dacpac格式只是一个包含一系列xml文件和SQL脚本的zip文件。如果您将文件的扩展名更改为zip,那么您将能够访问它所包含的文件。 postdeploy.sql文件应该包含你的post部署脚本和它引用的其他任何其他脚本的聚集。

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