Tim*_*dge 24 database-project visual-studio-2010 populate
如何使用Visual Studio数据库项目使用静态的源控制数据填充数据库?我已经尝试了以下所有三种策略,发现每一种策略都比上一次更好.我使用但不完全满意策略3.你有另一种选择吗?
将插入脚本放在"数据生成计划"文件夹中.引用"Script.PostDeployment.sql"文件中的脚本以将其包含在部署过程中.
- 优点:直截了当
- 缺点:slooooooow
- 缺点:后续部署必须首先删除静态数据或检查数据是否存在=>效率低下
使用最方便的方法(例如,可能是SSMS编辑表功能)第一次将数据插入数据库.使用bcp命令行实用程序提取该数据,以创建一堆数据文件并将其添加到项目中.创建"Scripts.PostDeployment.sql"文件中引用的脚本,该脚本为每个数据文件执行"批量插入"语句.
- 优点:比插入语句快得多
- 优点:可以利用SSMS编辑表功能
- 缺点:每个批量插入语句都需要数据文件的完全限定文件名,所以如果数据文件位于我的机器上"C" :\ Projects\Dev\Source\foo.dat"然后远程开发机器也必须在那个位置或批量插入语句失败
- 缺点:必须删除现有的静态数据,然后在后续部署中执行批量插入语句
在部署期间创建临时表以保存静态数据,并使用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 数据库项目投入生产,但对于我们的内部项目,我们将生产数据库加载到目标数据库中,并在开发/测试阶段对其进行构建/部署。也就是说,我知道如果您有多个产品数据库和每个数据库的静态数据,这可能对您不起作用。但是,对于像我们这样的单一产品数据库商店来说,它是可以完成的。
| 归档时间: |
|
| 查看次数: |
8292 次 |
| 最近记录: |