2014-02-21 64 views
2

我要開始在那裏的表與具有約束指示此列列創建一個具體的例子是一個外鍵: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 +開發人員的公司來說是正確的決定...

+0

對於您的示例,數據庫本身通常應處理約束重新指向。只需重命名目標表即可。對於「你怎麼改變已經運行changeSet」一般情況下@Jens的「不要,添加到他們」的答案是正確的。 –

+0

非常感謝您的意見。看來我還是不明白爲什麼甚至要使用Liquibase,以及哪些更改適用於不同環境中的更改集。我將進入它,因爲現在有大約200個開發人員被迫在我們公司使用它:) – JBA

+0

liquibase的核心是自動化版本的「在部署到生產環境時運行這些SQL命令」word文檔,並帶有其他功能。它通過使用其id/author/filename標識符跟蹤每個changeSet,確保每個SQL語句只運行一次(除非您指定的方式不同)。如果您想了解更多信息或背景信息,請發送電子郵件至:nathan AT liquibase.org –

回答

4

只要他們(對應與變更集一起的軟件/數據庫)修改變更集,尚未發佈。

我們將我們的更改集文件(以及代碼)保存在我們的源代碼庫中。在開發階段,每個人都可以更改當前正在開發的版本中定義的變更集。

只要版本發佈,變更集文件就被認爲是固定的,不應再改變。 (隨着發佈軟件的發佈,客戶將擁有一個反映變更集定義的數據庫)。

發佈後所以,你必須創建新的changeSet s表示

  1. 刪除外鍵約束
  2. 重命名錶
  3. 添加一個新的外鍵約束

更多或少一些,你需要完成你在數據庫中使用純sql的操作。 在這一點上,liquibase將或多或少地將您的changeSets轉換爲sql並將其應用於數據庫。所以一旦你找到一種方法來用slq做你的改變,也應該可以將它們放入liquibase變更集中。

+0

嗨,我們目前確實按照您的建議改變了changeSet的設置。對於發佈之後的場景,這正是我卡住的地方。但我不得不承認,我對Liquibase非常陌生,而且還沒有生成任何SQL。我只是希望文檔告訴我如何將一個列元素的約束轉換爲SQL ...我假設我將在進一步調查Liquibase-SQL Outut時看到這一點。非常感謝澄清! – JBA

+0

我做了這個接受的答案,因爲我猜想一旦我們離開了內存數據庫,我將更好地理解liquibase如何處理這些更改(並且不會在每次應用程序啓動時釋放所有內容)。再次感謝! – JBA