簡體   English   中英

使用Visual Studio 2010數據庫項目填充靜態數據的最佳實踐?

[英]Best practice to populate static data using a Visual Studio 2010 database project?

如何使用Visual Studio數據庫項目使用靜態的源控制數據填充數據庫? 我已經嘗試了以下所有三種策略,發現每一種策略都比上一次更好。 我使用但不完全滿意策略3.你有另一種選擇嗎?

  1. 將插入腳本放在“數據生成計划”文件夾中。 引用“Script.PostDeployment.sql”文件中的腳本以將其包含在部署過程中。

    - 優勢:直截了當
    - 缺點:slooooooow
    - 缺點:后續部署必須首先刪除靜態數據或檢查數據是否存在=>效率低下

  2. 使用最方便的方法(例如,可能是SSMS編輯表功能)第一次將數據插入數據庫。 使用bcp命令行實用程序提取該數據,以創建一堆數據文件並將其添加到項目中。 創建“Scripts.PostDeployment.sql”文件中引用的腳本,該腳本為每個數據文件執行“批量插入”語句。

    - 優點:比插入語句快得多
    - 優點:可以利用SSMS編輯表功能
    - 缺點:每個批量插入語句都需要數據文件的完全限定文件名,因此如果數據文件位於我的機器上“C:\\ Projects \\ Dev \\ Source \\ foo.dat”,那么遠程開發機器也必須將它們放在該位置或批量插入語句失敗
    - 缺點:必須在后續部署中執行批量插入語句之前刪除現有靜態數據

  3. 在部署期間創建臨時表以保存靜態數據,並使用sql merge語句將這些表與目標表同步。 查看這些博文中的任何一篇。

    - 優點:似乎sql merge對問題有完美的語義
    - 缺點:在每個文件中重復此策略的邏輯 - 缺點:表定義作為sql合並文件中的臨時表重復

是否有更優越的替代戰略? 我放棄了策略1,因為它太慢了。 由於完全限定的文件名問題,我不喜歡策略2。 我對戰略3感到滿意但並不激動。是否有最好的做法?

在您的insert.sql腳本中,您可以在[__RefactorLog]表(這是部署使用的系統表)中放置一個GUID,並在插入數據之前檢查此GUID是否存在,如下所示:

:setvar SOMEID“784B2FC9-2B1E-5798-8478-24EE856E62AE”//使用VS2010中的Tools \\ CreateGuid創建guid

如果不是EXISTS(SELECT [OperationKey] FROM [dbo]。[__ RefactorLog],其中[OperationKey] ='$(SOMEID)')

開始

...

INSERT INTO [dbo]。[__ RefactorLog]([OperationKey])值('$(SOMEID)')

結束

然后,只有在不存在或者您想要的情況下(通過更改Guid)才插入數據。

這是我解決這個問題的方法,以防其他人發現這個有用......

策略是在構建數據庫項目之前設置sqlcmdvars變量。 此變量將包含可從后部署腳本引用的構建文件夾的絕對路徑。 然后,在部署腳本中使用它可能需要的任何其他文件或資源都是一件簡單的事情。 此策略的優點是所有路徑都相對於項目文件,而不需要硬編碼的共享路徑。

創建一個新的Sql命令變量名$(MSBuildProjectDirectory)。 這將在prebuild腳本中被覆蓋。

創建一個msbuild腳本,用於設置sql命令變量並構建數據庫。

<Project ToolsVersion="4.0" DefaultTargets="BuildDatabase"  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
    <DatabaseServer>(Local)</DatabaseServer>
    <DeploymentConnectionString>Data Source=$(DatabaseServer)%3BIntegrated Security=True%3BPooling=False</DeploymentConnectionString>
    <Configuration>Release</Configuration>
</PropertyGroup>
<Target Name="BuildDatabase">
    <!-- Sets the projet path variable so that the post deployment script can determine the location of the bulk insert csv files. -->
    <XmlUpdate
        Prefix="urn"
        Namespace="urn:Microsoft.VisualStudio.Data.Schema.Package.SqlCmdVars"
        XmlFileName="$(MSBuildProjectDirectory)\DatabaseProjectName\Properties\Database.sqlcmdvars"
        XPath="/urn:SqlCommandVariables/urn:Properties/urn:Property[urn:PropertyName='MSBuildProjectDirectory']/urn:PropertyValue"
        Value="$(MSBuildProjectDirectory)\DatabaseProjectName" />

    <MSBuild
            Projects="DatabaseProjectName\DatabaseProjectName.dbproj"
            Properties="Configuration=$(Configuration);
                    TargetDatabase=DatabaseName;
                    TargetConnectionString=$(DeploymentConnectionString);
                    GenerateDropsIfNotInProject=True;
                    BlockIncrementalDeploymentIfDataLoss=False;
                    DeployToDatabase=True;
                    IgnorePermissions=True"
            Targets="Build;Deploy">
        <Output TaskParameter="TargetOutputs" ItemName="SqlFiles"/>
    </MSBuild>
</Target>

更新您的部署后腳本,如下所示...

BULK INSERT [dbo].[TableName] FROM '$(MSBuildProjectDirectory)\Scripts\Post-Deployment\Data\YourDataFile.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR='\n')

您可以使用數據庫項目中的架構輸出來更新目標數據庫有一個cmd工具可以在其他機器上運行它而不是為了您的vs2010 IDE

所以你的數據仍然是相同的,除非你有任何列的下降

我們還沒有將我們的VS 2010 db項目推廣到Production,但是對於我們的內部項目,我們將生產數據庫加載到目標數據庫,並在開發/測試階段構建/部署到它。 也就是說,我明白如果你有多個prod數據庫和靜態數據,那么對你來說可能不會有用。 但是,它可以用於像我們這樣的單個產品分銷商店。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM