Мне нужно изменить таблицу, чтобы добавить столбец и включить его в первичный ключ.
Итак, у меня есть набор изменений luiqbase:
Интересно, как разделить проблемы и правильно выполнить откат.
- изменения addColumn и PK в одном наборе изменений
<changeSet author="rahul" id="change_pk">
<addColumn tableName="posts">
<column name="aux_id" type="INT" defaultValue="0"/>
</addColumn>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
<rollback>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id"/>
</rollback>
</changeSet>
Что касается меня в этом подходе, так это то, что если я не могу создать столбец, я отброшу PK и создаю его заново, что может повлиять на время отклика БД, если предположить, что таблица довольно большая. Однако это делает все эти изменения атомарными.
- Переместить изменения PK в другой набор изменений
<changeSet author="rahul" id="add_col">
<addColumn tableName="posts">
<column name="aux_id" type="INT" defaultValue="0"/>
</addColumn>
</changeSet>
<changeSet author="rahul" id="change_pk">
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
<rollback>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id"/>
</rollback>
</changeSet>
Таким образом, я смогу лучше контролировать откат для изменений PK, который отбрасывает и воссоздает старый. Однако существует проблема, когда change_pk
changeset не применяется - у меня есть столбец, который должен быть включен в PK, но это не так, что делает систему уязвимой для уникальных нарушений ограничений.