使用Visual Studio 2010数据库项目填充静态数据的最佳实践?

Tim*_*dge 24 database-project visual-studio-2010 populate

如何使用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感到满意但并不激动.是否有最好的做法?

小智 8

在您的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).


小智 0

我们还没有将 VS 2010 数据库项目投入生产,但对于我们的内部项目,我们将生产数据库加载到目标数据库中,并在开发/测试阶段对其进行构建/部署。也就是说,我知道如果您有多个产品数据库和每个数据库的静态数据,这可能对您不起作用。但是,对于像我们这样的单一产品数据库商店来说,它是可以完成的。