【发布时间】:2011-05-15 20:38:28
【问题描述】:
您如何使用 Visual Studio 数据库项目向您的数据库填充静态的、源代码控制的数据?我已经尝试了以下所有三种策略,发现每一种都比上一种更好。我正在使用但对策略 3 不完全满意。您还有其他选择吗?
-
将插入脚本放在“数据生成计划”文件夹中。引用“Script.PostDeployment.sql”文件中的脚本,将它们包含在部署过程中。
-- 优点:直截了当
-- 缺点:slooooooow
-- 缺点:后续部署必须先删除静态数据或检查数据不存在=>效率低 -
第一次使用最方便的方法将数据插入数据库(例如,可以是 SSMS 编辑表功能)。使用 bcp 命令行实用程序提取该数据以创建一堆数据文件并将它们添加到您的项目中。创建在“Scripts.PostDeployment.sql”文件中引用的脚本,该脚本为每个数据文件执行“批量插入”语句。
-- 优点:比插入语句快得多
-- 优点:可以利用 SSMS 编辑表功能
-- 缺点:每个批量插入语句都需要数据文件的完全限定文件名,因此如果数据文件位于我的机器上的“C:\Projects\Dev\Source\foo.dat”,那么远程开发机器也必须将它们放在该位置,否则批量插入语句将失败
-- 缺点:在后续部署中执行批量插入语句之前必须删除现有的静态数据 -
在部署期间创建临时表来保存静态数据,并使用 sql 合并语句将这些表与目标表同步。请参阅 either 的 these 博客文章。
-- 优点:似乎 sql merge 对问题有完美的语义
-- 缺点:此策略的逻辑在每个文件中重复 -- 缺点:表定义在 sql 合并文件中作为临时表重复
有没有更好的替代策略?我放弃了策略 1,因为它太慢了。由于完全限定的文件名问题,我不喜欢策略 2。我对策略 3 感到满意,但并不激动。有最佳做法吗?
【问题讨论】:
-
您是否可以选择将数据保留在目标数据库中,而不是每次都重新填充?
-
@David:我不相信有任何这样的选择,除非有人可以告诉我。它需要以某种方式成为脚本解决方案的一部分。策略 3 使用 merge 命令处理此问题。必须修改策略 1 以在插入之前首先检查数据是否存在。策略 2 也是如此。
-
这可能对您没有什么安慰,但我们刚刚发布了 SQL Source Control 2,它具有静态数据支持。可悲的是,这不支持数据库项目——至少现在还不支持。但是,我们正在认真考虑这一点。如果你有兴趣,请在这里投票:redgate.uservoice.com/forums/39019-sql-source-control/…
-
对于策略 1,slooooooow 是轻描淡写的。我目前正在进行一个绿地项目。刚开始在数据库创建和默认数据中运行。我转向 DB 项目是为了寻找一种更好的方式来维护 DB 的东西,但现在我觉得手动运行脚本更容易,纯粹是因为它部署起来太慢了,而且正如你所说,如果你必须首先手动检查是否存在您想在部署后脚本中运行数据并使其具有幂等性。
标签: visual-studio-2010 populate database-project