【问题标题】:Liquibase: Specify schema when adding foreign key constraintLiquibase:添加外键约束时指定架构
【发布时间】:2018-08-16 04:51:36
【问题描述】:

我将 liquibase 3.5.5 与 postgresql 一起使用。我所有的表都是在指定的模式中创建的,但是当 liquibase 尝试生成 DDL 时,它会附加“public”。在referencesTableName 前面。我尝试将表名设为“identity.users”,但它只是尝试创建 public.“identity.users”。

例如下面的

<createTable tableName="users" schemaName="identity">
            <column name="id" type="bigint" defaultValueSequenceNext="seq_users">
                <constraints primaryKey="true" primaryKeyName="pk_users"/>
            </column>
</createTable>
<createTable tableName="external_identities" schemaName="identity">
            <column name="id" type="bigint" defaultValueSequenceNext="seq_external_identities">
                <constraints primaryKey="true" primaryKeyName="pk_external_identities"/>
            </column>
            <column name="user_id" type="bigint">
                <constraints foreignKeyName="fk_external_identities_users" referencedTableName="users" referencedColumnNames="id" nullable="false"/>
            </column>
</createTable>

生产:

 CREATE TABLE identity.external_identities (id BIGINT DEFAULT nextval('identity.seq_external_identities') NOT NULL, user_id BIGINT NOT NULL, CONSTRAINT fk_external_identities_users FOREIGN KEY (user_id) REFERENCES public.users(id))

文档没有多大帮助,XSD 文件没有将架构列为选项:

<!-- Attributes for constraints -->
    <xsd:attributeGroup name="constraintsAttributes">
        <xsd:attribute name="nullable" type="booleanExp" />
        <xsd:attribute name="primaryKey" type="booleanExp" />
        <xsd:attribute name="primaryKeyName" type="xsd:string" />
        <xsd:attribute name="primaryKeyTablespace" type="xsd:string" />
        <xsd:attribute name="unique" type="booleanExp" />
        <xsd:attribute name="uniqueConstraintName" type="xsd:string" />
        <xsd:attribute name="references" type="xsd:string" />
        <xsd:attribute name="referencedTableName" type="xsd:string"/>
        <xsd:attribute name="referencedColumnNames" type="xsd:string"/>
        <xsd:attribute name="foreignKeyName" type="xsd:string" />
        <xsd:attribute name="deleteCascade" type="booleanExp" />
        <xsd:attribute name="deferrable" type="booleanExp" />
        <xsd:attribute name="initiallyDeferred" type="booleanExp" />
        <xsd:attribute name="checkConstraint" type="xsd:string" />
    </xsd:attributeGroup>

【问题讨论】:

    标签: postgresql liquibase


    【解决方案1】:

    在 Liquibase 3.5 版中添加了对指定在 constraints 元素中定义的外键的引用模式的支持。在version 3.5 of the dbchangelog XSD 中,您可以在constraints 元素上找到新的referencedTableSchemaName 属性。

    如果您的变更日志 XML 文件仍导入较旧的 XSD 版本,Liquibase 将无法识别此新属性,因此请确保 databaseChangeLog 根元素引用 XSD 文件的 3.5 或更新版本:

        <databaseChangeLog
                xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
            <!-- ... -->
        </databaseChangeLog>
    

    然后使用 referencedTableSchemaName 属性的值更新列定义的约束元素:

        <column name="user_id" type="bigint">
            <constraints
                foreignKeyName="fk_external_identities_users"
                referencedTableSchemaName="identity"
                referencedTableName="users"
                referencedColumnNames="id"
                nullable="false"/>
        </column>
    

    【讨论】:

      【解决方案2】:

      必须将 changeSet 与 sql 一起使用,例如: ALTER TABLE schema.table ADD CONSTRAINT 约束 FOREIGN KEY (fk_field) REFERENCES schema.ref_table (field)

      【讨论】:

        【解决方案3】:

        尝试使用单独的changeset 添加外键约束。它将是addForeignKeyConstraint。它具有架构属性。

        ChangeSet 将如下所示:

        <changeSet author="liquibase-docs" id="addForeignKeyConstraint-example">
            <addForeignKeyConstraint
                    baseColumnNames="user_id"
                    baseTableName="external_identities"
                    constraintName="fk_external_identities_users"
                    referencedColumnNames="id"
                    referencedTableName="users"
                    baseTableSchemaName="identity"
                    referencedTableSchemaName="identity"/>
        </changeSet>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-01
          • 1970-01-01
          相关资源
          最近更新 更多