Visual studio 2017 使Evolve(DB迁移)擦除包括所有模式

Visual studio 2017 使Evolve(DB迁移)擦除包括所有模式,visual-studio-2017,database-migration,sql-server-2016,flyway,Visual Studio 2017,Database Migration,Sql Server 2016,Flyway,我使用的是基于Flyway的数据库迁移。当我从头开始创建数据库时,我的迁移脚本会创建名为rls和“legacy”的模式,rls中的函数和过程,以及legacy中的表 当我将Evolve命令设置为erase以擦除我的数据库以便从头开始创建它时,它首先失败,因为我有一些安全策略依赖于我猜Evolve无法检测到的表。因此,我自己删除这些文件,然后再次构建项目以运行擦除命令,输出窗口显示: 4> Executing Erase... 4> Evolve initialized. 4>

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

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

4>  Executing Erase...
4>  Evolve initialized.
4>  Successfully erased schema dbo.
4>  Erase schema(s) completed: 1 erased, 0 skipped.
注意,它只提到模式dbo,甚至没有将其他模式列为跳过。我数据库中
dbo
模式中的所有对象都消失了,但是
rls
legacy
中的对象仍然存在,包括模式本身。因此,如果我现在将命令切换回
migrate
,从头开始创建数据库,那么当它试图创建这些对象时,它会爆炸,因为它们已经存在。根据文件,它应该

[擦除]模式的所有数据库对象(表、视图…) 由进化创建的或被发现为空的


为什么不删除它们?

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

.\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.

因此,您可能需要从命令中删除“Create schema”命令,并将模式的名称传递给evolve,evolve随后将为您创建它们。

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

.\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.

因此,您可能需要从您的命令中删除“创建模式”命令,而不是将模式的名称传递给evolve,evolve随后将为您创建它们。

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