2015-08-28 55 views
0

我們的HSQLDB數據庫具有從PAYMENTS表到USERS表的FK約束。我們在這裏做錯了什麼是創建一個約束,而不給它一個特定的名稱。這會導致HSQLDB爲你生成一個名字,例如SYS_FK_10985。HSQLDB無法刪除未找到的外鍵約束對象

我所做的是爲Liquibase編寫一個自定義更改集,它將查找索引的名稱並將其刪除。什麼是腳本所做的是非常簡單的:

ALTER TABLE PAYMENTS DROP CONSTRAINT SYS_FK_10985; 

成功執行補丁和降約束的命令是:

SELECT constraint_name FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME= 'PAYMENTS' AND COLUMN_NAME= 'USER_ID'; 

如果找到了,它是由相同的變更集執行以下查詢回落添加到HSQLDB的.log文件中,然而,當我們想要運行HSQLDB實例時,它會拋出一個錯誤,指出無法找到該對象。

HSQLDB throws exception

日誌文件如下所示:

DB log file

的主要問題是錯誤的索引(一個不存在的一個)在日誌文件中,這自然會導致被丟棄HSQLDB拋出異常。更糟糕的是:發生異常時,該行後的所有內容都將從日誌文件中刪除,甚至不會存儲在.data文件中。

約束名稱更改是否可能導致更改集名稱錯誤?

+0

請不要將截圖粘貼到問題中,除非它是一個圖形相關的問題。文字更好。 – SteveDonie

回答

1

您需要在此操作後執行CHECKPOINT或任何一系列結構更改。

CHECKPOINT會將更改保存到.script文件中並刪除.log文件,從而避免出現問題。