КАСКАД для dropIndex в CockroachDB - PullRequest
0 голосов
/ 24 февраля 2020

Liquibase: После того, как liquibase написал для снятия ограничения unq_customer_id.

 <dropIndex indexName="unq_customer_id"
            schemaName="public"
            tableName="CUSTOMER_LOGIN_EVENT"/>

Я использовал dropIndex, поскольку CockroachDB реализует уникальные ограничения путем создания индекса. CASCADE требуется для удаления этого индекса.

Но я не уверен, как использовать каскад в приведенном выше сценарии liquibase, поскольку dropIndex XSD не имеет опции для CASCADE.

<xsd:element name="dropIndex">
    <xsd:complexType>
       <xsd:attributeGroup ref="tableNameAttribute"/>
       <xsd:attributeGroup ref="indexName"/>
       <xsd:attribute name="associatedWith" type="xsd:string" use="optional" />
    </xsd:complexType>
</xsd:element> 

Ошибка:

ОШИБКА: индекс "unq_customer_id" используется в качестве уникального ограничения (используйте CASCADE, если вы действительно хотите удалить его) [Сбой SQL: DROP INDEX publi c .unq_customer_id]

1 Ответ

3 голосов
/ 24 февраля 2020

Прямой ответ таков: когда logi c в любой из функций Liquibase не удовлетворяет вашим потребностям, вы можете выбрать следующие параметры:

  1. Укажите точное значение sql, которое вы хотите с помощью <sql> тег. Это дает вам контроль над тем, что именно будет работать, и позволяет вам с помощью Liquibase все, что ваша база данных предоставляет для SQL

Пример:

<changeSet id="1" author="xyz">
   <sql>DROP INDEX customer_login_event@unq_customer_id cascade</sql>
<changeSet>
Добавьте блок <modifySql> в свой набор изменений. Это позволяет вам по-прежнему использовать тег dropIndex, но настроить SQL.

Пример:

<changeSet id="1" author="xyz">
    <dropIndex indexName="unq_customer_id"
               schemaName="public"
               tableName="CUSTOMER_LOGIN_EVENT"/>
    <modifySql>
        <replace replace="unq_customer_id" with="customer_login_event@unq_customer_id"/>
        <append value=" CASCADE"/>
    </modifySql>
</changeSet>

Но я бы также спросил, есть ли лучший ответ в вашем дело в сценарии удаления ограничения, а не индекса? DROP ... CASCADE может быть пугающим вызовом, поскольку вы не видите / не контролируете то, что на самом деле отбрасывается.

Они реализуют ограничение, создавая индекс, но с вашей точки зрения это должно быть просто деталью реализации. Если вы изначально создали ограничение, более читаемым / понятным / более безопасным может быть удаление ограничения, которое должно привести к тому, что CockroachDB удалит соответствующий индекс, а не удалит индекс таким образом, чтобы прозрачно удалить ограничение.

...