每个DDL SQL命令都是可逆的吗? [数据库版本控制]
-
02-07-2019 - |
题
我想设置一种跟踪数据库架构更改的机制,例如这个答案:
对于您所做的每一项更改 数据库,你写了一个新的迁移。 迁移通常有两种方法: “向上”改变的方法 应用“向下”和“向下”方法 哪些更改已撤消。单身 命令使数据库达到 日期,也可以用来带 数据库到特定版本 架构。
我的问题如下:每个DDL命令都在“up”中吗?方法可逆吗?换句话说,我们是否可以始终提供“向下”状态。方法?您能想象任何无法“向下”编辑的DDL命令吗?
请不要考虑“up”期间的典型数据迁移问题。我们丢失数据的方法:例如将字段类型从 datetime
( DateOfBirth
)更改为 int
( YearOfBirth
)我们正在丢失无法生成的数据恢复。
解决方案
在sql server中我知道的每个DDL命令都是一个向上/向下对。
其他提示
除了数据丢失之外,我所做过的每次迁移都是可逆的。也就是说,Rails提供了一种将迁移标记为“破坏性”的方法:
有些转变具有破坏性 以一种无法逆转的方式。 这种迁移应该提高 一个ActiveRecord :: IrreversibleMigration 他们的down方法中有例外。
请参阅API文档此处。
是的,您已经确定了丢失数据的情况,无论是通过转换还是简单地在“向上”中丢弃数据。迁移。
另一个例子是你可以删除一个SEQUENCE对象,从而失去它的状态。 “向下”迁移将重新创建序列,但它将从1开始。这可能导致序列生成重复值。如果您在空数据库上执行迁移并且希望序列从1开始,但是如果您有一些数据行,则您希望序列重置为最大值,这不是问题目前正在使用中,除非您对该表有独占锁定,否则难以可靠地执行。
任何其他依赖于数据库中数据状态的DDL都存在类似问题。这可能不是一个好的架构设计,我只是想想任何适合你问题的案例。