2011-02-27 126 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