1

我的解决方案中有一个 Visual Studio 数据库项目,用于管理对数据库和源代码控制的更改。

我在 Script.PostDeployment.sql 中运行的项目中的 Scripts/Post-Deployment 文件夹下的每个表都有一个脚本,如下所示:

:r .\Data.Script1.sql
:r .\Data.Script2.sql
....

这些脚本使用“Insert Into tablename ...”语句填充所需的数据,例如查找表。

我面临的问题是:

  1. 如果在上面的示例中 Script1 由于数据库已经存在而失败,并且由于纠正数据中的拼写错误等结构的微小变化而我正在重新部署,那么批处理的其余部分也将中止。
  2. 插入语句中的更改不会传播,因为当分解到现有数据库时,Data.*.sql 文件中的第一条语句将失败,因为该行已经存在。

Visual Studio 数据库项目有没有办法比较现有数据库中的数据并根据行是否已经存在来使用插入或更新?

感谢您的输入

4

2 回答 2

1

您应该在 Data.*.sql 文件中使用 MERGE INTO 而不是 INSERT INTO 语句。

有关详细信息,请参阅此 MSDN 文章,http://blogs.msdn.com/b/ssdt/archive/2012/02/02/including-data-in-an-sql-server-database-project.aspx

于 2013-08-11T12:21:37.423 回答
0

您概述的问题已通过liquibaseflyway等迁移工具解决。它们记录已经应用到数据库的迁移,因此只会运行特定版本的新更改。

其他语言中也存在类似的工具。我个人可以推荐liquibase,我在命令行模式下使用(用于非 Java 项目)并集成到应用程序代码中。

于 2013-08-08T21:18:28.123 回答