代码之家  ›  专栏  ›  技术社区  ›  Mad Scientist

一个liquibase变更集中的两个先决条件

  •  -1
  • Mad Scientist  · 技术社区  · 6 年前

    是否可以为变更集的单个元素创建两个预编辑?例如,如果变更日志文件在SQL Server数据库中运行,则生成列;如果变更日志文件在Oracle数据库中运行,则生成另一列。以这样的方式例如:

    <changeSet author="Me" id="1528876614155">
     <createTable tableName="ELECTRICITY_PRODUCTS">
    
       <preConditions onFail="MARK_RAN" onSqlOutput="TEST">
            <dbms type="mssql" />
            <column autoIncrement="true" name="EP_ID" type="NUMBER">
       </preConditions>
       <preConditions onFail="MARK_RAN" onSqlOutput="TEST">
            <dbms type="oracle" />
            <column autoIncrement="false" name="EP_ID" type="FLOAT">
       </preConditions>
     </createTable>
    </changeset>
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   bilak    6 年前

    无法在条件中创建列。

    如果我理解你的问题,那么你有两个(也许更多)选择:

    1. 为每个dbms分离变更集
    2. 为dbms创建属性并使用它们,如下所示:

      <property dbms="oracle" name="autoincrement" value="true" />
      <property dbms="oracle" name="autoincrementType" value="NUMBER" />
      <property dbms="mssql" name="autoincrement" value="false" />
      <property dbms="mssql" name="autoincrementType" value="FLOAT" />
      
      
      <changeSet id="create_a_table" author="system">
          <createTable tableName="a_table">
              <column name="a_column" autoIncrement="${autoincrement}" type="${autoincrementType}" />
          </createTable>
      </changeSet>
      

    我没有测试,只是想知道如何解决这个问题。

        2
  •  0
  •   Mad Scientist    6 年前

    这似乎是不可能的,但另一个好的解决方案是为这些单个元素创建变更集。在本例中,可能是:

    <changeSet author="Me" id="1528876614155">
        <createTable tableName="DAILY DATA">
            <column name="ID" type="NUMBER"/>
        </createTable>
    </changeset>
    
    <changeSet author="Me" id="1528876614156">
        <preConditions onFail="MARK_RAN" onSqlOutput="TEST">
            <dbms type="oracle" />
        </preConditions>
        <addColumn tableName="DAILY_DATA">
            <column name="VALUE" type="NUMBER"/>
        </addColumn>
    </changeset>
    <changeSet author="Me" id="1528876614157">
        <preConditions onFail="MARK_RAN" onSqlOutput="TEST">
            <dbms type="mssql" />
        </preConditions>
        <addColumn tableName="DAILY_DATA">
            <column name="VALUE" type="NUMBER"/>
        </addColumn>
    </changeset>