2010-09-01 98 views
6

我們使用liquibase讓我們的數據庫更改軌道落差約束.. 第一變更包含這些行:Liquibase不知道它的名字

<column name="SHORT_ID" type="INTEGER"> 
    <constraints unique="true" /> 
</column> 

基本上就意味着SHORT_ID列具有唯一約束,但這個名字約束可以是任何,每次通常是不同的(我們對H2數據庫進行一些集成測試,每次運行測試時都會創建新的基礎)

所以..問題是:我無法更改此第一個changeSet,但現在我們必須擺脫這種獨特的限制。任何想法如何通過使用liquibase來實現?

回答

3

H2的用於刪除約束的SQL需要一個約束名稱。我不記得H2中的自動生成的約束名是隨機的還是跨數據庫是一致的。

如果它是不變的,你可以使用正常的liquibase標籤,它會正常工作。

如果它是隨機的,則必須從information_schema獲取約束名稱。 H2可以讓類似:

alter table TABLE_NAME drop constraint 
     (select unique_index_name 
       from information_schema.constraints 
       where table_name='TABLE_NAME' and column_name='SHORT_ID') 

如果沒有,你可能需要創建liquibase更改自定義(http://liquibase.org/extensions 2.0,http://www.liquibase.org/manual/custom_refactoring_class 1.9),使通話和下降的約束。

+1

試過這之前..不能有下降約束命令中的選擇子句:)和約束名稱是不一致的..我試圖避免這些自定義重構類,但它真的好像只有選項..所以謝謝你的方法和+1,如果沒有自定義liquibase更改沒有人提出解決方案,那麼這一個將是我接受的答案..;] – vrm 2010-09-01 20:59:26

+1

我遇到了同樣的問題,在ms sql server的drop constraint命令中不允許選擇。我最終做了以下操作以刪除表容器https://bowerstudios.com/node/995上的col測量的唯一約束(因爲評論框中的字符不足)。解決方案與Nathan's相呼應,但針對ms sql server進行了調整。 – 2012-08-28 13:52:15

1

對於HSQL其內森建議不起作用查詢(改變表TABLE_NAME降約束 (從information_schema.constraints 選擇unique_index_name 在表格名= 'TABLE_NAME' 和列名= 'SHORT_ID'))

這是因爲DDL和SQL不能混用。

通過在運行時知道名稱來刪除約束似乎不可能與HSQL(我需要在回滾之前在刪除具有約束的列之前進行回滾)。這對Oracle和MSSQL是可能的。

我所做的是通過hbm文件(休眠)獲取生成的數據庫。由於hibernate不支持命名唯一的密鑰約束,因此例如使用liquibase(對於HSQL),使用約束刪除這些列是不可能的。我們有基於HSQL測試的測試。對於獲得HSQL解決方案會很好。

現在,我只是硬編碼的唯一約束名稱(周圍的工作)

2

Liquibase提供刪除一個非空約束不知道約束名稱的實現。當問這個問題時可能不存在(我意識到這很舊)。

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat" 
      columnDataType="int" 
      columnName="id" 
      schemaName="public" 
      tableName="person"/> 

一個dropUniqueConstraint存在,但你可能已經知道這件事,因爲它需要約束的名字。