我要開始在那裏的表與具有約束指示此列列創建一個具體的例子是一個外鍵:Liquibase改變列約束
<changeSet id="1" author="A1">
<createTable tableName="TABLE_A">
<!-- Other columns -->
<column name="FK_TABLE_B" type="BIGINT">
<!-- the 'TABLE_B' will be renamed soon ! -->
<constraints references="TABLE_B(ID_PK)"
foreignKeyName="JUST_UNIQUE_I_GUESS" nullable="false" />
</column>
</createTable>
</changeSet>
現在第一個問題:假設表-B會重命名爲TABLE_NEW ...我想如何更改上述約束,使其指向重命名的表列ID_PK?
我看到幾個可能性:
- 修改變更本身(與H2 inMemory DB沒有問題......但是...... CMON權那不是愛迪爾?)
- 刪除整列在我自己的changeSet中添加一個新的約束條件,這可能會使sence,因爲列名可能會改變爲FK_TABLE_NEW反正......但這不是一個真正有效的生產環境
- 以某種方式改變約束 - >但是如何!?該文件是完全沒有 幫助...
接下來的問題則是,爲什麼有限制的這種方式,如果有一個
<addForeignKeyConstraint ...>
呢?
因此,目前我根本感覺不到Liquibase,因爲這是我第一次嘗試改變現有的ChangeSet,而我最大的問題是:這是一個不理解最佳實踐或實際上是「不是這樣的問題」的問題verbouse「文檔?
感謝您的幫助!
我試圖
以上約束定義假設當與
<addForeignKeyConstraint ...>
標籤,但用更少的屬性進行某種方式導致相同的。所以我想我可以使用
<dropForeignKeyConstraint ...>
標籤首先刪除ForeignKeyConstraint,然後添加一個新的。但它仍然告訴我,當試圖執行H2內存數據庫中的第一個changeSet時,不會找到表TABLE_B。
我的變更集是這樣的:
<changeSet id="1" author="A2">
<dropForeignKeyConstraint baseTableName="TABLE_A"
constraintName="JUST_UNIQUE_I_GUESS" />
<addForeignKeyConstraint
constraintName="JUST_UNIQUE_I_GUESS"
referencedTableName="TABLE_NEW" baseColumnNames="FK_TABLE_B"
baseTableName="TABLE_A" referencedColumnNames="ID_PK" />
</changeSet>
背景信息
由於目前正在只使用一個內存數據庫只(H2)它沒有什麼大不了的,只是改變建設POC第一次改變直到我們有一個最終的方案狀態......但是如果你已經擁有一個現有的數據庫,數百萬個信息和東西,如何處理這些事情?目前我非常懷疑Liquibase對於沒有聘請Liquibase專家的1k +開發人員的公司來說是正確的決定...
對於您的示例,數據庫本身通常應處理約束重新指向。只需重命名目標表即可。對於「你怎麼改變已經運行changeSet」一般情況下@Jens的「不要,添加到他們」的答案是正確的。 –
非常感謝您的意見。看來我還是不明白爲什麼甚至要使用Liquibase,以及哪些更改適用於不同環境中的更改集。我將進入它,因爲現在有大約200個開發人員被迫在我們公司使用它:) – JBA
liquibase的核心是自動化版本的「在部署到生產環境時運行這些SQL命令」word文檔,並帶有其他功能。它通過使用其id/author/filename標識符跟蹤每個changeSet,確保每個SQL語句只運行一次(除非您指定的方式不同)。如果您想了解更多信息或背景信息,請發送電子郵件至:nathan AT liquibase.org –