【问题标题】:Is every DDL SQL command reversible? [database version control]每个 DDL SQL 命令都是可逆的吗? 【数据库版本控制】
【发布时间】:2010-09-12 18:28:06
【问题描述】:

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

对于您对 数据库,你写一个新的迁移。 迁移通常有两种方法: 一种“向上”的方法,其中的变化 应用和一个“向下”的方法 哪些更改已撤消。一个 命令使数据库达到 日期,也可以用来带 数据库到特定版本 架构。

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

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

【问题讨论】:

    标签: sql version-control migration ddl


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      有些转换是破坏性的 以无法逆转的方式。 这种迁移应该引起 一个 ActiveRecord::IrreversibleMigration 他们的 down 方法中的异常。

      请参阅 API 文档here

      【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        相关资源
        最近更新 更多