3

我想设置一种机制来跟踪数据库架构更改,例如此答案中描述的机制:

对于您对数据库所做的每一次更改,您都会编写一个新的迁移。迁移通常有两种方法:应用更改的“向上”方法和撤消更改的“向下”方法。单个命令使数据库保持最新,也可用于将数据库带入特定版本的模式。

我的问题如下:“向上”方法中的每个 DDL 命令是否可逆?换句话说,我们可以一直提供一个“down”的方法吗?你能想象任何不能“关闭”的 DDL 命令吗?

请不要考虑典型的数据迁移问题,在“向上”方法期间我们会丢失数据:例如,将字段类型从datetime( DateOfBirth) 更改为int( YearOfBirth),我们会丢失无法恢复的数据。

4

3 回答 3

4

在 sql server 中,我知道的每个 DDL 命令都是一个向上/向下对。

于 2008-09-24T15:16:28.307 回答
2

除了数据丢失之外,我所做的每一次迁移都是可逆的。也就是说,Rails 提供了一种将迁移标记为“破坏性”的方法:

某些转换以无法逆转的方式具有破坏性。这种迁移应该在其 down 方法中引发 ActiveRecord::IrreversibleMigration 异常。

请参阅此处的 API 文档。

于 2008-09-24T15:22:47.747 回答
2

是的,您已经确定了丢失数据的情况,无论是通过转换它还是在“向上”迁移中简单地 DROP COLUMN。

另一个例子是你可以删除一个 SEQUENCE 对象,从而失去它的状态。“向下”迁移将重新创建序列,但它会从 1 重新开始。这可能会导致序列生成重复值。如果您在空数据库上执行迁移,并且您希望序列从 1 开始,这不是问题,但是如果您有一定数量的数据行,您希望将序列重置为最大值当前正在使用,这很难可靠地完成,除非您对该表具有排他锁。

任何其他依赖于数据库中数据状态的 DDL 都有类似的问题。首先,这可能不是一个好的架构设计,我只是想考虑任何适合您问题的案例。

于 2008-09-24T17:58:20.210 回答