【问题标题】:Make Evolve (DB Migration) Erase include all schemasMake Evolve (DB Migration) Erase 包括所有模式
【发布时间】:2018-05-05 15:23:56
【问题描述】:

我正在使用基于 Flyway 的 Evolve 进行数据库迁移。当我从头开始创建数据库时,我的迁移脚本会创建名为 rls 和“旧版”的模式、rls 中的函数和过程以及legacy 中的表。

当我将 Evolve 命令设置为 erase 以擦除我的数据库以便我可以从头开始创建它时,它首先失败了,因为我有几个依赖于我猜 Evolve 无法检测到的表的安全策略。所以我自己删除了这些并再次构建我的项目以运行 Erase 命令,输出窗口显示:

4>  Executing Erase...
4>  Evolve initialized.
4>  Successfully erased schema dbo.
4>  Erase schema(s) completed: 1 erased, 0 skipped.

请注意,它只提到了架构 dbo,甚至没有将其他架构列为已跳过。我的数据库中dbo 架构中的所有对象都消失了,但rlslegacy 中的对象仍然存在,包括架构本身。因此,如果我现在将我的命令切换回migrate 以从头开始创建数据库,那么当它尝试创建这些对象时它会爆炸,因为它们已经存在。根据文档,它应该是

[erase] 模式的所有数据库对象(表、视图...) 由 Evolve 创建或发现为空。

为什么不删除它们?

【问题讨论】:

  • 只是好奇 - 你为什么选择 Evolve 而不是 Flyway 本身(或 ReadyRoll Core,如果你使用 VS Enterprise)?
  • 我是这些概念的新手,花在上面的时间 。我们没有做 CI,Evolve 看起来就像我们需要的一样,而且易于安装和使用。我无法快速确定如何在 Windows 和 Visual Studio 中设置和开始使用 Flyway,或者它对我的小团队来说是否过于复杂。这么长的回答简短:学习曲线太陡了。
  • 你有 VS Enterprise 吗?如果是这样,请尝试我工作的公司的 ReadyRoll Core,因为如果这对您很重要,它具有深度 VS 集成。
  • 看起来真不错。我喜欢我过去使用的红门工具。我想我只有 VS Professional。我们现在不做 CI,所以我真正需要的是让每个开发人员的本地 Db 保持最新的能力,以及在签入迁移时避免冲突/冲突的能力。我不确定您如何使用 ReadyRoll 完成后者。在进化中,我们只是牺牲了在文件名中使用描述并将它们全部命名为 v1_X__migration.sql 以便文件名会发生冲突以表明可能需要合并。
  • 所以你是在强制合并冲突以防出现重复或依赖问题?这似乎有点苛刻。当您尝试执行迁移时,您能否允许问题发生并发现它? ReadyRoll 受益于持续验证,因为它总是尝试在后台构建“影子”数据库。

标签: visual-studio-2017 database-migration sql-server-2016 flyway evolve


【解决方案1】:

如果 Evolve 将其标记为空,那么它可以擦除数据库:

$ dotnet evolve migrate '@args.txt'
Executing Migrate...
Evolve initialized.
Mark schema public as empty. <-----------------------------  EMPTY 
No metadata found.
Successfully applied migration V1_1_1__CreateUser.sql in 244 ms.
Successfully applied migration V1_1_2__CreateProduct.sql in 67 ms.


$ dotnet evolve erase '@args.txt'
Evolve initialized.
Executing Erase...
Successfully erased schema public.
Erase schema(s) completed: 1 erased, 0 skipped.

注意:如果进化没有将其公共方案标记为空,则手动删除数据库。

【讨论】:

    【解决方案2】:

    您需要在调用参数中包含架构名称,如下所示:

    .\evolve.exe -c "Host=10.10.10.10;Port=5432;Database=a;Username=a;Password=v;Enlist=true" -l .\db -s dbo -s rls -s legacy --metadata-table-schema migrations erase postgresql 
    

    请注意,evolve 只能删除 Evolve 创建的模式。否则,您会收到此错误:

    This schema was not empty when Evolve first started migrations.
    

    因此,您可能需要从命令中删除“创建架构”命令,而是将架构的名称传递给进化,然后进化将为您创建它们。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多