【问题标题】:Pre loading data in database projects在数据库项目中预加载数据
【发布时间】:2013-08-06 14:10:49
【问题描述】:

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

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

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

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

我面临的问题是:

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

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

感谢您的意见

【问题讨论】:

  • 我很想知道 MSDN 文章的解决方案是否适合您,它是否提供了您需要的所有控制?
  • 我还没有时间进一步探索它。它现在基本上在后座上。但是,一旦我找到可行的解决方案或尝试 Merge,我会立即更新。合并看起来很有希望,但语法看起来不太友好

标签: database visual-studio-2010 deployment


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多